udata 10.1.3.dev34283__py2.py3-none-any.whl → 10.1.3.dev34303__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 (34) hide show
  1. udata/core/user/api.py +8 -1
  2. udata/core/user/models.py +16 -11
  3. udata/core/user/tasks.py +81 -2
  4. udata/core/user/tests/test_user_model.py +29 -12
  5. udata/settings.py +5 -0
  6. udata/static/chunks/{10.8ca60413647062717b1e.js → 10.471164b2a9fe15614797.js} +3 -3
  7. udata/static/chunks/{10.8ca60413647062717b1e.js.map → 10.471164b2a9fe15614797.js.map} +1 -1
  8. udata/static/chunks/{11.b6f741fcc366abfad9c4.js → 11.55ab79044cda0271b595.js} +3 -3
  9. udata/static/chunks/{11.b6f741fcc366abfad9c4.js.map → 11.55ab79044cda0271b595.js.map} +1 -1
  10. udata/static/chunks/{13.2d06442dd9a05d9777b5.js → 13.f29411b06be1883356a3.js} +2 -2
  11. udata/static/chunks/{13.2d06442dd9a05d9777b5.js.map → 13.f29411b06be1883356a3.js.map} +1 -1
  12. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js → 17.3bd0340930d4a314ce9c.js} +2 -2
  13. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js.map → 17.3bd0340930d4a314ce9c.js.map} +1 -1
  14. udata/static/chunks/{19.f03a102365af4315f9db.js → 19.3e0e8651d948e04b8cf2.js} +3 -3
  15. udata/static/chunks/{19.f03a102365af4315f9db.js.map → 19.3e0e8651d948e04b8cf2.js.map} +1 -1
  16. udata/static/chunks/{8.778091d55cd8ea39af6b.js → 8.494b003a94383b142c18.js} +2 -2
  17. udata/static/chunks/{8.778091d55cd8ea39af6b.js.map → 8.494b003a94383b142c18.js.map} +1 -1
  18. udata/static/chunks/{9.033d7e190ca9e226a5d0.js → 9.07515e5187f475bce828.js} +3 -3
  19. udata/static/chunks/{9.033d7e190ca9e226a5d0.js.map → 9.07515e5187f475bce828.js.map} +1 -1
  20. udata/static/common.js +1 -1
  21. udata/static/common.js.map +1 -1
  22. udata/templates/mail/account_inactivity.html +29 -0
  23. udata/templates/mail/account_inactivity.txt +22 -0
  24. udata/templates/mail/inactive_account_deleted.html +5 -0
  25. udata/templates/mail/inactive_account_deleted.txt +6 -0
  26. udata/tests/api/test_me_api.py +1 -1
  27. udata/tests/api/test_user_api.py +47 -8
  28. udata/tests/user/test_user_tasks.py +144 -0
  29. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/METADATA +4 -1
  30. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/RECORD +34 -29
  31. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/LICENSE +0 -0
  32. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/WHEEL +0 -0
  33. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/entry_points.txt +0 -0
  34. {udata-10.1.3.dev34283.dist-info → udata-10.1.3.dev34303.dist-info}/top_level.txt +0 -0
udata/static/common.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,d){for(var t,b,_=0,n=[];_<f.length;_++)b=f[_],r[b]&&n.push.apply(n,r[b]),r[b]=0;for(t in d){var i=d[t];switch(typeof i){case"object":e[t]=function(c){var a=c.slice(1),r=c[0];return function(c,f,d){e[r].apply(this,[c,f,d].concat(a))}}(i);break;case"function":e[t]=i;break;default:e[t]=e[i]}}for(c&&c(f,d);n.length;)n.shift().call(null,__webpack_require__);if(d[0])return a[0]=0,__webpack_require__(0)};var a={},r={31:0};__webpack_require__.e=function(e,c){if(0===r[e])return c.call(null,__webpack_require__);if(void 0!==r[e])r[e].push(c);else{r[e]=[c];var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.src=__webpack_require__.p+"chunks/"+e+"."+{0:"4dd4f378428d1eed85c8",1:"0a96f54313c89e541ccb",2:"c67aa76cc078c193aed5",3:"174a03e48d267820919b",4:"98dca3045c034c154d5f",5:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"778091d55cd8ea39af6b",9:"033d7e190ca9e226a5d0",10:"8ca60413647062717b1e",11:"b6f741fcc366abfad9c4",12:"1be61e0201691821bff6",13:"2d06442dd9a05d9777b5",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"e8e4caaad5cb0cc0bacc",18:"56444ebd2456a4ba2201",19:"f03a102365af4315f9db",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
1
+ !function(e){function __webpack_require__(c){if(a[c])return a[c].exports;var r=a[c]={exports:{},id:c,loaded:!1};return e[c].call(r.exports,r,r.exports,__webpack_require__),r.loaded=!0,r.exports}var c=window.webpackJsonp;window.webpackJsonp=function(f,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:"0fa1408dae4e76b87b2e",6:"d663709d877baa44a71e",7:"896bbffe39433bb598f7",8:"494b003a94383b142c18",9:"07515e5187f475bce828",10:"471164b2a9fe15614797",11:"55ab79044cda0271b595",12:"1be61e0201691821bff6",13:"f29411b06be1883356a3",14:"bc3f6bc0a67517e7b30f",15:"2f5d8e3d4aa4c46188d7",16:"aaa39ef2d7e82594efc8",17:"3bd0340930d4a314ce9c",18:"56444ebd2456a4ba2201",19:"3e0e8651d948e04b8cf2",20:"3d4e02d1205a3c9e26c5",21:"af1610ce169cf6d1cf4e",22:"6a69068a7dd9d767dea1",23:"663b89b79d755a70deef",24:"d149cf025cbbca231d88",25:"1fafd6424761185cc14b",26:"402064cda3665d56f7fc",27:"997802f273a0c88f7b6d",28:"e68c475c6ca1e2eec92c",29:"2f4a04c61d75f2ef18ab",30:"e97e10c9246818e2b4b2",32:"03cc9867716dd58b9302",33:"011b367beb543774f950"}[e]+".js",a.appendChild(f)}},__webpack_require__.m=e,__webpack_require__.c=a,__webpack_require__.p="/static/"}(function(e){for(var c in e)if(Object.prototype.hasOwnProperty.call(e,c))switch(typeof e[c]){case"function":break;case"object":e[c]=function(c){var a=c.slice(1),r=e[c[0]];return function(e,c,f){r.apply(this,[e,c,f].concat(a))}}(e[c]);break;default:e[c]=e[e[c]]}return e}([]));
2
2
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 44a61f162b1337addb9e"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","parentJsonpFunction","window","chunkIds","moreModules","chunkId","i","callbacks","length","installedChunks","push","apply","_m","args","slice","templateId","a","b","c","this","concat","shift","31","e","callback","undefined","head","document","getElementsByTagName","script","createElement","type","charset","async","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","32","33","appendChild","m","Object","prototype","hasOwnProperty","fn"],"mappings":"CAAS,SAAUA,GCwDnB,QAAAC,qBAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,qBAGAI,EAAAE,QAAA,EAGAF,EAAAD,QA3EA,GAAAK,GAAAC,OAAA,YACAA,QAAA,sBAAAC,EAAAC,GAIA,IADA,GAAAV,GAAAW,EAAAC,EAAA,EAAAC,KACQD,EAAAH,EAAAK,OAAoBF,IAC5BD,EAAAF,EAAAG,GACAG,EAAAJ,IACAE,EAAAG,KAAAC,MAAAJ,EAAAE,EAAAJ,IACAI,EAAAJ,GAAA,CAEA,KAAAX,IAAAU,GAAA,CACA,GAAAQ,GAAAR,EAAAV,EAGA,cAAAkB,IACA,aAEApB,EAAAE,GAAA,SAAAkB,GACA,GAAAC,GAAAD,EAAAE,MAAA,GAAAC,EAAAH,EAAA,EACA,iBAAAI,EAAAC,EAAAC,GACA1B,EAAAuB,GAAAJ,MAAAQ,MAAAH,EAAAC,EAAAC,GAAAE,OAAAP,MAEMD,EACN,MACA,gBAEApB,EAAAE,GAAAkB,CACA,MACA,SAEApB,EAAAE,GAAAF,EAAAoB,IAKA,IADAX,KAAAE,EAAAC,GACAG,EAAAC,QACAD,EAAAc,QAAArB,KAAA,KAAAP,oBACA,IAAAW,EAAA,GAEA,MADAT,GAAA,KACAF,oBAAA,GAKA,IAAAE,MAKAc,GACAa,GAAA,EA6BA7B,qBAAA8B,EAAA,SAAAlB,EAAAmB,GAEA,OAAAf,EAAAJ,GACA,MAAAmB,GAAAxB,KAAA,KAAAP,oBAGA,IAAAgC,SAAAhB,EAAAJ,GACAI,EAAAJ,GAAAK,KAAAc,OACI,CAEJf,EAAAJ,IAAAmB,EACA,IAAAE,GAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,SACAD,GAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EAEAJ,EAAAK,IAAAzC,oBAAA0C,EAAA,UAAA9B,EAAA,KAAsE+B,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAAk5B/D,GAAA,MACx9BqB,EAAA2C,YAAAxC,KAKApC,oBAAA6E,EAAA9E,EAGAC,oBAAAyB,EAAAvB,EAGAF,oBAAA0C,EAAA,YDIW,SAAS3C,GAEnB,IAAI,GAAIc,KAAKd,GACZ,GAAG+E,OAAOC,UAAUC,eAAezE,KAAKR,EAASc,GAChD,aAAcd,GAAQc,IACtB,IAAK,WAAY,KACjB,KAAK,SAEJd,EAAQc,GAAM,SAASM,GACtB,GAAIC,GAAOD,EAAGE,MAAM,GAAI4D,EAAKlF,EAAQoB,EAAG,GACxC,OAAO,UAAUI,EAAEC,EAAEC,GACpBwD,EAAG/D,MAAMQ,MAAOH,EAAEC,EAAEC,GAAGE,OAAOP,MAE9BrB,EAAQc,GACV,MACD,SAECd,EAAQc,GAAKd,EAAQA,EAAQc,IAKhC,MAAOd","file":"common.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// install a JSONP callback for chunk loading\n/******/ \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n/******/ \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n/******/ \t\t// add \"moreModules\" to the modules object,\n/******/ \t\t// then flag all \"chunkIds\" as loaded and fire callback\n/******/ \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n/******/ \t\tfor(;i < chunkIds.length; i++) {\n/******/ \t\t\tchunkId = chunkIds[i];\n/******/ \t\t\tif(installedChunks[chunkId])\n/******/ \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n/******/ \t\t\tinstalledChunks[chunkId] = 0;\n/******/ \t\t}\n/******/ \t\tfor(moduleId in moreModules) {\n/******/ \t\t\tvar _m = moreModules[moduleId];\n/******/\n/******/ \t\t\t// Check if module is deduplicated\n/******/ \t\t\tswitch(typeof _m) {\n/******/ \t\t\tcase \"object\":\n/******/ \t\t\t\t// Module can be created from a template\n/******/ \t\t\t\tmodules[moduleId] = (function(_m) {\n/******/ \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n/******/ \t\t\t\t\treturn function (a,b,c) {\n/******/ \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n/******/ \t\t\t\t\t};\n/******/ \t\t\t\t}(_m));\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tcase \"function\":\n/******/ \t\t\t\t// Normal module\n/******/ \t\t\t\tmodules[moduleId] = _m;\n/******/ \t\t\t\tbreak;\n/******/ \t\t\tdefault:\n/******/ \t\t\t\t// Module is a copy of another module\n/******/ \t\t\t\tmodules[moduleId] = modules[_m];\n/******/ \t\t\t\tbreak;\n/******/ \t\t\t}\n/******/ \t\t}\n/******/ \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n/******/ \t\twhile(callbacks.length)\n/******/ \t\t\tcallbacks.shift().call(null, __webpack_require__);\n/******/ \t\tif(moreModules[0]) {\n/******/ \t\t\tinstalledModules[0] = 0;\n/******/ \t\t\treturn __webpack_require__(0);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// object to store loaded and loading chunks\n/******/ \t// \"0\" means \"already loaded\"\n/******/ \t// Array means \"loading\", array contains callbacks\n/******/ \tvar installedChunks = {\n/******/ \t\t31:0\n/******/ \t};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/ \t// This file contains only the entry chunk.\n/******/ \t// The chunk loading function for additional chunks\n/******/ \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n/******/ \t\t// \"0\" is the signal for \"already loaded\"\n/******/ \t\tif(installedChunks[chunkId] === 0)\n/******/ \t\t\treturn callback.call(null, __webpack_require__);\n/******/\n/******/ \t\t// an array means \"currently loading\".\n/******/ \t\tif(installedChunks[chunkId] !== undefined) {\n/******/ \t\t\tinstalledChunks[chunkId].push(callback);\n/******/ \t\t} else {\n/******/ \t\t\t// start chunk loading\n/******/ \t\t\tinstalledChunks[chunkId] = [callback];\n/******/ \t\t\tvar head = document.getElementsByTagName('head')[0];\n/******/ \t\t\tvar script = document.createElement('script');\n/******/ \t\t\tscript.type = 'text/javascript';\n/******/ \t\t\tscript.charset = 'utf-8';\n/******/ \t\t\tscript.async = true;\n/******/\n/******/ \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[chunkId] + \".js\";\n/******/ \t\t\thead.appendChild(script);\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/static/\";\n/******/ })\n/************************************************************************/\n/******/ ((function(modules) {\n\t// Check all modules for deduplicated modules\n\tfor(var i in modules) {\n\t\tif(Object.prototype.hasOwnProperty.call(modules, i)) {\n\t\t\tswitch(typeof modules[i]) {\n\t\t\tcase \"function\": break;\n\t\t\tcase \"object\":\n\t\t\t\t// Module can be created from a template\n\t\t\t\tmodules[i] = (function(_m) {\n\t\t\t\t\tvar args = _m.slice(1), fn = modules[_m[0]];\n\t\t\t\t\treturn function (a,b,c) {\n\t\t\t\t\t\tfn.apply(this, [a,b,c].concat(args));\n\t\t\t\t\t};\n\t\t\t\t}(modules[i]));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Module is a copy of another module\n\t\t\t\tmodules[i] = modules[modules[i]];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn modules;\n}([])));\n\n\n/** WEBPACK FOOTER **\n ** common.js\n **/"," \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, callbacks = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId])\n \t\t\t\tcallbacks.push.apply(callbacks, installedChunks[chunkId]);\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tvar _m = moreModules[moduleId];\n\n \t\t\t// Check if module is deduplicated\n \t\t\tswitch(typeof _m) {\n \t\t\tcase \"object\":\n \t\t\t\t// Module can be created from a template\n \t\t\t\tmodules[moduleId] = (function(_m) {\n \t\t\t\t\tvar args = _m.slice(1), templateId = _m[0];\n \t\t\t\t\treturn function (a,b,c) {\n \t\t\t\t\t\tmodules[templateId].apply(this, [a,b,c].concat(args));\n \t\t\t\t\t};\n \t\t\t\t}(_m));\n \t\t\t\tbreak;\n \t\t\tcase \"function\":\n \t\t\t\t// Normal module\n \t\t\t\tmodules[moduleId] = _m;\n \t\t\t\tbreak;\n \t\t\tdefault:\n \t\t\t\t// Module is a copy of another module\n \t\t\t\tmodules[moduleId] = modules[_m];\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules);\n \t\twhile(callbacks.length)\n \t\t\tcallbacks.shift().call(null, __webpack_require__);\n \t\tif(moreModules[0]) {\n \t\t\tinstalledModules[0] = 0;\n \t\t\treturn __webpack_require__(0);\n \t\t}\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// \"0\" means \"already loaded\"\n \t// Array means \"loading\", array contains callbacks\n \tvar installedChunks = {\n \t\t31:0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId, callback) {\n \t\t// \"0\" is the signal for \"already loaded\"\n \t\tif(installedChunks[chunkId] === 0)\n \t\t\treturn callback.call(null, __webpack_require__);\n\n \t\t// an array means \"currently loading\".\n \t\tif(installedChunks[chunkId] !== undefined) {\n \t\t\tinstalledChunks[chunkId].push(callback);\n \t\t} else {\n \t\t\t// start chunk loading\n \t\t\tinstalledChunks[chunkId] = [callback];\n \t\t\tvar head = document.getElementsByTagName('head')[0];\n \t\t\tvar script = document.createElement('script');\n \t\t\tscript.type = 'text/javascript';\n \t\t\tscript.charset = 'utf-8';\n \t\t\tscript.async = true;\n\n \t\t\tscript.src = __webpack_require__.p + \"chunks/\" + chunkId + \".\" + {\"0\":\"4dd4f378428d1eed85c8\",\"1\":\"0a96f54313c89e541ccb\",\"2\":\"c67aa76cc078c193aed5\",\"3\":\"174a03e48d267820919b\",\"4\":\"98dca3045c034c154d5f\",\"5\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"778091d55cd8ea39af6b\",\"9\":\"033d7e190ca9e226a5d0\",\"10\":\"8ca60413647062717b1e\",\"11\":\"b6f741fcc366abfad9c4\",\"12\":\"1be61e0201691821bff6\",\"13\":\"2d06442dd9a05d9777b5\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"e8e4caaad5cb0cc0bacc\",\"18\":\"56444ebd2456a4ba2201\",\"19\":\"f03a102365af4315f9db\",\"20\":\"3d4e02d1205a3c9e26c5\",\"21\":\"af1610ce169cf6d1cf4e\",\"22\":\"6a69068a7dd9d767dea1\",\"23\":\"663b89b79d755a70deef\",\"24\":\"d149cf025cbbca231d88\",\"25\":\"1fafd6424761185cc14b\",\"26\":\"402064cda3665d56f7fc\",\"27\":\"997802f273a0c88f7b6d\",\"28\":\"e68c475c6ca1e2eec92c\",\"29\":\"2f4a04c61d75f2ef18ab\",\"30\":\"e97e10c9246818e2b4b2\",\"32\":\"03cc9867716dd58b9302\",\"33\":\"011b367beb543774f950\"}[chunkId] + \".js\";\n \t\t\thead.appendChild(script);\n \t\t}\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/static/\";\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 44a61f162b1337addb9e\n **/"],"sourceRoot":""}
1
+ {"version":3,"sources":["webpack:///common.js","webpack:///webpack/bootstrap 0ab1659a41a61777d788"],"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\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"55ab79044cda0271b595\",\"12\":\"1be61e0201691821bff6\",\"13\":\"f29411b06be1883356a3\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"3bd0340930d4a314ce9c\",\"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\":\"0fa1408dae4e76b87b2e\",\"6\":\"d663709d877baa44a71e\",\"7\":\"896bbffe39433bb598f7\",\"8\":\"494b003a94383b142c18\",\"9\":\"07515e5187f475bce828\",\"10\":\"471164b2a9fe15614797\",\"11\":\"55ab79044cda0271b595\",\"12\":\"1be61e0201691821bff6\",\"13\":\"f29411b06be1883356a3\",\"14\":\"bc3f6bc0a67517e7b30f\",\"15\":\"2f5d8e3d4aa4c46188d7\",\"16\":\"aaa39ef2d7e82594efc8\",\"17\":\"3bd0340930d4a314ce9c\",\"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 0ab1659a41a61777d788\n **/"],"sourceRoot":""}
@@ -0,0 +1,29 @@
1
+ {% extends 'mail/base.html' %}
2
+ {% from 'mail/button.html' import mail_button %}
3
+
4
+ {% block body %}
5
+ <p style="margin: 0;padding: 0;">
6
+ {{ _(
7
+ 'Your account (%(user_email)s) has been inactive for %(inactivity_years)d years or more.',
8
+ user_email=user.email,
9
+ inactivity_years=config.YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION
10
+ )
11
+ }}
12
+ </p>
13
+ <br/>
14
+ <p style="margin: 0;padding: 0;"><b>
15
+ {{ _(
16
+ 'If you want to keep your account, please log in with your account on %(site)s.',
17
+ site=config.SITE_TITLE
18
+ )
19
+ }}
20
+ </b></p>
21
+ <br/>
22
+ <p style="margin: 0;padding: 0;">
23
+ {{ _(
24
+ 'Without logging in, your account will be deleted within %(notify_delay)d days.',
25
+ notify_delay=config.DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY
26
+ )
27
+ }}
28
+ </p>
29
+ {% endblock %}
@@ -0,0 +1,22 @@
1
+ {% extends 'mail/base.txt' %}
2
+
3
+ {% block body %}
4
+ {{ _(
5
+ 'Your account (%(user_email)s) has been inactive for %(inactivity_years)d years or more.',
6
+ user_email=user.email,
7
+ inactivity_years=config.YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION
8
+ )
9
+ }}
10
+
11
+ {{ _(
12
+ 'If you want to keep your account, please log in with your account on %(site)s.',
13
+ site=config.SITE_TITLE
14
+ )
15
+ }}
16
+
17
+ {{ _(
18
+ 'Without logging in, your account will be deleted within %(notify_delay)d days.',
19
+ notify_delay=config.DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY
20
+ )
21
+ }}
22
+ {% endblock %}
@@ -0,0 +1,5 @@
1
+ {% extends 'mail/base.html' %}
2
+
3
+ {% block body %}
4
+ <p style="margin: 0;padding: 0;">{{ _('Your account on %(site)s has been deleted due to inactivity', site=config.SITE_TITLE) }}</p>
5
+ {% endblock %}
@@ -0,0 +1,6 @@
1
+ {% extends 'mail/base.txt' %}
2
+
3
+ {% block body %}
4
+ {{ _('Your account on %(site)s has been deleted due to inactivity', site=config.SITE_TITLE) }}.
5
+
6
+ {% endblock %}
@@ -332,7 +332,7 @@ class MeAPITest(APITestCase):
332
332
 
333
333
  # The discussions are kept but the messages are anonymized
334
334
  self.assertEqual(len(discussion.discussion), 2)
335
- self.assertEqual(discussion.discussion[0].content, "DELETED")
335
+ self.assertEqual(discussion.discussion[0].posted_by.fullname, "DELETED DELETED")
336
336
  self.assertEqual(discussion.discussion[1].content, other_disc_msg_content)
337
337
 
338
338
  # The datasets are unchanged
@@ -1,8 +1,9 @@
1
1
  from flask import url_for
2
2
 
3
3
  from udata.core import storages
4
+ from udata.core.discussions.factories import DiscussionFactory, MessageDiscussionFactory
4
5
  from udata.core.user.factories import AdminFactory, UserFactory
5
- from udata.models import Follow
6
+ from udata.models import Discussion, Follow
6
7
  from udata.tests.helpers import capture_mails, create_test_image
7
8
  from udata.utils import faker
8
9
 
@@ -352,36 +353,74 @@ class UserAPITest(APITestCase):
352
353
  def test_delete_user(self):
353
354
  user = AdminFactory()
354
355
  self.login(user)
355
- other_user = UserFactory()
356
+ user_to_delete = UserFactory()
356
357
  file = create_test_image()
358
+ discussion = DiscussionFactory(
359
+ user=user_to_delete,
360
+ discussion=[
361
+ MessageDiscussionFactory(posted_by=user_to_delete),
362
+ MessageDiscussionFactory(posted_by=user_to_delete),
363
+ ],
364
+ )
357
365
 
358
366
  response = self.post(
359
- url_for("api.user_avatar", user=other_user),
367
+ url_for("api.user_avatar", user=user_to_delete),
360
368
  {"file": (file, "test.png")},
361
369
  json=False,
362
370
  )
363
371
  with capture_mails() as mails:
364
- response = self.delete(url_for("api.user", user=other_user))
372
+ response = self.delete(url_for("api.user", user=user_to_delete))
365
373
  self.assertEqual(list(storages.avatars.list_files()), [])
366
374
  self.assert204(response)
367
375
  self.assertEquals(len(mails), 1)
368
376
 
369
- other_user.reload()
370
- response = self.delete(url_for("api.user", user=other_user))
377
+ user_to_delete.reload()
378
+ response = self.delete(url_for("api.user", user=user_to_delete))
371
379
  self.assert410(response)
372
380
  response = self.delete(url_for("api.user", user=user))
373
381
  self.assert403(response)
374
382
 
383
+ # discussions are kept by default
384
+ discussion.reload()
385
+ assert len(discussion.discussion) == 2
386
+ assert discussion.discussion[1].content != "DELETED"
387
+
375
388
  def test_delete_user_without_notify(self):
376
389
  user = AdminFactory()
377
390
  self.login(user)
378
- other_user = UserFactory()
391
+ user_to_delete = UserFactory()
379
392
 
380
393
  with capture_mails() as mails:
381
- response = self.delete(url_for("api.user", user=other_user, no_mail=True))
394
+ response = self.delete(url_for("api.user", user=user_to_delete, no_mail=True))
382
395
  self.assert204(response)
383
396
  self.assertEqual(len(mails), 0)
384
397
 
398
+ def test_delete_user_with_comments_deletion(self):
399
+ user = AdminFactory()
400
+ self.login(user)
401
+ user_to_delete = UserFactory()
402
+ discussion_only_user = DiscussionFactory(
403
+ user=user_to_delete,
404
+ discussion=[
405
+ MessageDiscussionFactory(posted_by=user_to_delete),
406
+ MessageDiscussionFactory(posted_by=user_to_delete),
407
+ ],
408
+ )
409
+ discussion_with_other = DiscussionFactory(
410
+ user=user,
411
+ discussion=[
412
+ MessageDiscussionFactory(posted_by=user),
413
+ MessageDiscussionFactory(posted_by=user_to_delete),
414
+ ],
415
+ )
416
+
417
+ response = self.delete(url_for("api.user", user=user_to_delete, delete_comments=True))
418
+ self.assert204(response)
419
+
420
+ assert Discussion.objects(id=discussion_only_user.id).first() is None
421
+ discussion_with_other.reload()
422
+ assert discussion_with_other.discussion[1].content == "DELETED"
423
+
385
424
  def test_contact_points(self):
386
425
  user = AdminFactory()
387
426
  self.login(user)
@@ -0,0 +1,144 @@
1
+ from datetime import datetime, timedelta
2
+
3
+ import pytest
4
+ from flask import current_app
5
+
6
+ from udata.core.discussions.factories import DiscussionFactory
7
+ from udata.core.user import tasks
8
+ from udata.core.user.factories import UserFactory
9
+ from udata.core.user.models import User
10
+ from udata.i18n import gettext as _
11
+ from udata.tests.api import APITestCase
12
+ from udata.tests.helpers import capture_mails
13
+
14
+
15
+ class UserTasksTest(APITestCase):
16
+ @pytest.mark.options(YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION=3)
17
+ def test_notify_inactive_users(self):
18
+ notification_comparison_date = (
19
+ datetime.utcnow()
20
+ - timedelta(days=current_app.config["YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION"] * 365)
21
+ + timedelta(days=current_app.config["DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY"])
22
+ - timedelta(days=1) # add margin
23
+ )
24
+
25
+ inactive_user = UserFactory(current_login_at=notification_comparison_date)
26
+ UserFactory(current_login_at=datetime.utcnow()) # Active user
27
+
28
+ with capture_mails() as mails:
29
+ tasks.notify_inactive_users()
30
+
31
+ # Assert (only one) mail has been sent
32
+ self.assertEqual(len(mails), 1)
33
+ self.assertEqual(mails[0].send_to, set([inactive_user.email]))
34
+ self.assertEqual(
35
+ mails[0].subject,
36
+ _("Inactivity of your {site} account").format(site=current_app.config["SITE_TITLE"]),
37
+ )
38
+
39
+ # We shouldn't notify users twice
40
+ with capture_mails() as mails:
41
+ tasks.notify_inactive_users()
42
+
43
+ self.assertEqual(len(mails), 0)
44
+
45
+ @pytest.mark.options(YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION=3)
46
+ @pytest.mark.options(MAX_NUMBER_OF_USER_INACTIVITY_NOTIFICATIONS=10)
47
+ def test_notify_inactive_users_max_notifications(self):
48
+ notification_comparison_date = (
49
+ datetime.utcnow()
50
+ - timedelta(days=current_app.config["YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION"] * 365)
51
+ + timedelta(days=current_app.config["DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY"])
52
+ - timedelta(days=1) # add margin
53
+ )
54
+
55
+ NB_USERS_TO_NOTIFY = 15
56
+
57
+ [UserFactory(current_login_at=notification_comparison_date) for _ in range(15)]
58
+ UserFactory(current_login_at=datetime.utcnow()) # Active user
59
+
60
+ with capture_mails() as mails:
61
+ tasks.notify_inactive_users()
62
+
63
+ # Assert MAX_NUMBER_OF_USER_INACTIVITY_NOTIFICATIONS mails have been sent
64
+ self.assertEqual(
65
+ len(mails), current_app.config["MAX_NUMBER_OF_USER_INACTIVITY_NOTIFICATIONS"]
66
+ )
67
+
68
+ # Second batch
69
+ with capture_mails() as mails:
70
+ tasks.notify_inactive_users()
71
+
72
+ # Assert what's left have been sent
73
+ self.assertEqual(
74
+ len(mails),
75
+ NB_USERS_TO_NOTIFY - current_app.config["MAX_NUMBER_OF_USER_INACTIVITY_NOTIFICATIONS"],
76
+ )
77
+
78
+ @pytest.mark.options(YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION=3)
79
+ def test_delete_inactive_users(self):
80
+ deletion_comparison_date = (
81
+ datetime.utcnow()
82
+ - timedelta(days=current_app.config["YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION"] * 365)
83
+ - timedelta(days=1) # add margin
84
+ )
85
+
86
+ notification_comparison_date = (
87
+ datetime.utcnow()
88
+ - timedelta(days=current_app.config["DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY"])
89
+ - timedelta(days=1) # add margin
90
+ )
91
+
92
+ inactive_user_to_delete = UserFactory(
93
+ current_login_at=deletion_comparison_date,
94
+ inactive_deletion_notified_at=notification_comparison_date,
95
+ )
96
+ UserFactory(current_login_at=datetime.utcnow()) # Active user
97
+ discussion = DiscussionFactory(user=inactive_user_to_delete)
98
+ discussion_title = discussion.title
99
+
100
+ with capture_mails() as mails:
101
+ tasks.delete_inactive_users()
102
+
103
+ # Assert (only one) mail has been sent
104
+ self.assertEqual(len(mails), 1)
105
+ self.assertEqual(mails[0].send_to, set([inactive_user_to_delete.email]))
106
+ self.assertEqual(
107
+ mails[0].subject,
108
+ _(
109
+ _("Deletion of your inactive {site} account").format(
110
+ site=current_app.config["SITE_TITLE"]
111
+ )
112
+ ),
113
+ )
114
+
115
+ # Assert user has been deleted but not its discussion
116
+ inactive_user_to_delete.reload()
117
+ discussion.reload()
118
+ self.assertEqual(inactive_user_to_delete.fullname, "DELETED DELETED")
119
+ self.assertEqual(discussion.title, discussion_title)
120
+
121
+ @pytest.mark.options(YEARS_OF_INACTIVITY_BEFORE_DEACTIVATION=3)
122
+ def test_keep_inactive_users_that_logged_in(self):
123
+ notification_comparison_date = (
124
+ datetime.utcnow()
125
+ - timedelta(days=current_app.config["DAYS_BEFORE_ACCOUNT_INACTIVITY_NOTIFY_DELAY"])
126
+ - timedelta(days=1) # add margin
127
+ )
128
+
129
+ inactive_user_that_logged_in_since_notification = UserFactory(
130
+ current_login_at=datetime.utcnow(),
131
+ inactive_deletion_notified_at=notification_comparison_date,
132
+ )
133
+
134
+ with capture_mails() as mails:
135
+ tasks.delete_inactive_users()
136
+
137
+ # Assert no mail has been sent
138
+ self.assertEqual(len(mails), 0)
139
+
140
+ # Assert user hasn't been deleted and won't be deleted
141
+ self.assertEqual(User.objects().count(), 1)
142
+ user = User.objects().first()
143
+ self.assertEqual(user, inactive_user_that_logged_in_since_notification)
144
+ self.assertIsNone(user.inactive_deletion_notified_at)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: udata
3
- Version: 10.1.3.dev34283
3
+ Version: 10.1.3.dev34303
4
4
  Summary: Open data portal
5
5
  Home-page: https://github.com/opendatateam/udata
6
6
  Author: Opendata Team
@@ -140,6 +140,9 @@ It is collectively taken care of by members of the
140
140
 
141
141
  ## Current (in progress)
142
142
 
143
+ - Add inactive users notification and deletion jobs [#3274](https://github.com/opendatateam/udata/pull/3274)
144
+ - these jobs can be scheduled daily for example
145
+ - `YEARS_OF_INACTIVITY_BEFORE_DELETION` setting must be configured at least to activate it
143
146
  - **breaking change** Migrate dataservices fields, migration needed [#3262](https://github.com/opendatateam/udata/pull/3262)
144
147
  - Add views as Dataservice metrics and sort [#3280](https://github.com/opendatateam/udata/pull/3280)
145
148
  - Fix creating/updating ID for resources [#3239](https://github.com/opendatateam/udata/pull/3239)
@@ -13,7 +13,7 @@ udata/mail.py,sha256=FMGHcDAjHvk86iDUwBmVXpx3vbAb2c-j5C3BRnh9IYQ,2670
13
13
  udata/rdf.py,sha256=IVwXAJ-ICpgp1Vo4QLKYWHk0MAmLNUU8LVEF0GLxFMk,18098
14
14
  udata/routing.py,sha256=x9WcpYikR45j3C_0Bi2Zoa2treSCW_oDYWMHwbdLAmE,7242
15
15
  udata/sentry.py,sha256=ekcxqUSqxfM98TtvCsPaOoX5i2l6PEcYt7kb4l3od-Q,3223
16
- udata/settings.py,sha256=F1Zx8Lr0dk11fFamu-PDj6LIgM6qsRX0R23fqvmqS9g,18801
16
+ udata/settings.py,sha256=vrfJV9AyNqPIAqzJotPTqKhdNfLN-EQlFAN5lgHckf4,18986
17
17
  udata/sitemap.py,sha256=oRRWoPI7ZsFFnUAOqGT1YuXFFKHBe8EcRnUCNHD7xjM,979
18
18
  udata/tags.py,sha256=ydq4uokd6bzdeGVSpEXASVtGvDfO2LfQs9mptvvKJCM,631
19
19
  udata/tasks.py,sha256=hLdmHV7ozeq803BRjU6X3DT3oVsZrV1beQILpbjsfQI,4978
@@ -236,7 +236,7 @@ udata/core/topic/parsers.py,sha256=dk4Siju3G5hOkMa3O01y14V1bRtdA01uvEUGrseimF4,2
236
236
  udata/core/topic/permissions.py,sha256=RtFPPlxuU_Bv7ip6LDO4AoPrKFnIOEs9cCMXaSSmEdk,118
237
237
  udata/core/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
238
  udata/core/user/activities.py,sha256=x-mSiwx7TzM2ci6KMkMiNx0sFs8J3LTJNbigtE8cA0s,2807
239
- udata/core/user/api.py,sha256=sn5R0S2LCk0XqWcTbW06qP69TY6bznyRpv2uCBVC72s,13221
239
+ udata/core/user/api.py,sha256=zqGTUgiMyv1sNs2HTvIJIcoqKfjcWqplH9iCTEI3Nic,13436
240
240
  udata/core/user/api_fields.py,sha256=9aUdaYPUON-cFhTA10Mch5gYK9zkrFBLe4rrTxnQXoE,5491
241
241
  udata/core/user/apiv2.py,sha256=4eNsvJjb4ChJQFrXtVbkOtAvXEcQcQpZf8vkEbriXRA,1125
242
242
  udata/core/user/commands.py,sha256=d33hjgUi8WLA8YFvoq__FJJ_E-fk8f4tWo1iuT8jJvM,3156
@@ -244,11 +244,11 @@ udata/core/user/constants.py,sha256=aTluhTR2RGZ_cdG7-mkEoT5Ndbg8BNUwwzCOld0aLMY,
244
244
  udata/core/user/factories.py,sha256=kkwaojciLzfuAOeRnL1E7XCcGPo8waAal_G2eeuVc0k,825
245
245
  udata/core/user/forms.py,sha256=yotqZozH9ViKuNI8SwdKocDEi7NXVs_XUMpdr_bIe5s,966
246
246
  udata/core/user/metrics.py,sha256=ZuCxYHu-770IsO-KPMhh-ZDkl2hYSVCuHDRvp-H1NfA,1192
247
- udata/core/user/models.py,sha256=zpP3omla4vTWiPqFUS3ndRT8uAjNwrl_DYh82ILjiHU,10183
247
+ udata/core/user/models.py,sha256=0T8t3daPJRDPSugzO3LaPEk-eP1cW3Zh8Agxlm63jV8,10463
248
248
  udata/core/user/permissions.py,sha256=Wbd8bLqSjqp9RHJ6ffLBj74L-LECcAhWazuw4Hq-2Gk,435
249
249
  udata/core/user/rdf.py,sha256=F6SDX65ECtVOjDtHXI9WMmq33pN7HWb5ntOqe3LQsbQ,834
250
- udata/core/user/tasks.py,sha256=OXy6bZnr7Mld_VzhMWlNyrkhC4K57IR7H0eSjFDZucU,317
251
- udata/core/user/tests/test_user_model.py,sha256=2KtKMpOUPP1nReO4FGImvCzsGmhZYreUq4MffhOTDDo,2298
250
+ udata/core/user/tasks.py,sha256=xMuDYIlFs_qS-757E5tMMjqkUQsfQKZlNykNE9iH6Z8,3475
251
+ udata/core/user/tests/test_user_model.py,sha256=9tjtxvzUNpoT2SjLBxAS8hEDWlUBQwTcnv-c8Ws3rN8,2857
252
252
  udata/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
253
253
  udata/db/tasks.py,sha256=6PDnvvrE0lmQ3ss7sDLu8MUYHxUWW17NGgHCq9UnraY,151
254
254
  udata/event/__init__.py,sha256=2G9g1C_dp3yap4ehJE950Bnl1uQtD00TsvTFZhvhRS8,41
@@ -434,8 +434,8 @@ udata/static/admin.css,sha256=gPM7oSehylBXQXyv0-gQ1LuyJiI1STQ_swM4CHjq_cs,185748
434
434
  udata/static/admin.css.map,sha256=dzFd_AL3pQPFiww5oRwqnubDGJ9HNtYuAaiggLTjjB0,627543
435
435
  udata/static/admin.js,sha256=iQnNCFKqwiSIMyJIeDBAD_gEwv8fABrzK5CoK3PZZME,1330409
436
436
  udata/static/admin.js.map,sha256=09cK62bu_h0M4ajLf-Y2-sQCUFYPWKRw1PCQWQvfQyM,8518351
437
- udata/static/common.js,sha256=rqzFNDJ_fLCqUFEuukjdRj2_Vkr2BrtgSRjeSeXT8Fc,2252
438
- udata/static/common.js.map,sha256=-ohcxv586iqhCpUM18yxuYeqOimN3sCVIVO4WlOlXSI,14137
437
+ udata/static/common.js,sha256=owC43at6gQVXRbnISjMLv1gnwrnKTVSbTyAZVzVX8x0,2252
438
+ udata/static/common.js.map,sha256=2wnaLDHKzSsuNs8Jb81sTPkZrKttUAYoAYZgiwQSQgY,14137
439
439
  udata/static/fontawesome-webfont.eot,sha256=e_yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk,165742
440
440
  udata/static/fontawesome-webfont.svg,sha256=rWFXkmwWIrpOHQPUePFUE2hSS_xG9R5C_g2UX37zI-Q,444379
441
441
  udata/static/fontawesome-webfont.ttf,sha256=qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg,165548
@@ -452,26 +452,26 @@ udata/static/chunks/0.4dd4f378428d1eed85c8.js,sha256=4nKpGcBFtcbZ7dw_0O1VhQQxHbE
452
452
  udata/static/chunks/0.4dd4f378428d1eed85c8.js.map,sha256=OD3YTnZl3yAptpS1L0_OXBuSV5r8TuogQXg36bnaJgg,1671597
453
453
  udata/static/chunks/1.0a96f54313c89e541ccb.js,sha256=A-lYXUeTLFOd_al9J_EpYMsbJZRYMYmPlIdgmnwxiuI,304248
454
454
  udata/static/chunks/1.0a96f54313c89e541ccb.js.map,sha256=Z4uWu-Bwj4JnQ49hqzkbRrfbtRUm65X93JQyDV6aLTM,1741737
455
- udata/static/chunks/10.8ca60413647062717b1e.js,sha256=_jYUDOKowPicIui04ekBIOQvXAcF-ypsX5oxiORA8pw,414740
456
- udata/static/chunks/10.8ca60413647062717b1e.js.map,sha256=XjAwHasDgaIA5idTs79YNuDC9Zlit8Xg20vSRptk03U,2736059
457
- udata/static/chunks/11.b6f741fcc366abfad9c4.js,sha256=tEngIoDvhl43LF9VQ8AqdEeyid7VMxG8VI5ZEUFNkAQ,395562
458
- udata/static/chunks/11.b6f741fcc366abfad9c4.js.map,sha256=rzMYdPM-AXsdyQ73SbUXBhtDmsUBbFubXWxZRC0uF3o,2268951
455
+ udata/static/chunks/10.471164b2a9fe15614797.js,sha256=sZ7HhLG8c-gdmtSlZHmjt7-vtu0AIGy89qZmAduSEyM,414740
456
+ udata/static/chunks/10.471164b2a9fe15614797.js.map,sha256=qmVKIeXYE9_GW-vnDrt0oj0KbUXURInBUvc9i6mZRuo,2736059
457
+ udata/static/chunks/11.55ab79044cda0271b595.js,sha256=EhKlFZhIYlOskB0jnGHC1VKWD5oA_hlFaVc14eUMwvY,395562
458
+ udata/static/chunks/11.55ab79044cda0271b595.js.map,sha256=EgvtUo2aG6sNDoZ0es4d6f5Vv78NIOutK-EhUuf7r3k,2268951
459
459
  udata/static/chunks/12.1be61e0201691821bff6.js,sha256=oveRcMtBsi97LUeAX86LjSAEVIpNxfWGHVovetKfPTw,421097
460
460
  udata/static/chunks/12.1be61e0201691821bff6.js.map,sha256=ikkgGwMdOXW4ZXyucmqrxLqJQHIcXJJoMMNt01QFrZM,2442221
461
- udata/static/chunks/13.2d06442dd9a05d9777b5.js,sha256=p0DaqvjBIQCU1WkdfskEOZPb5Z9PpUsib8EqTx4iA5w,420590
462
- udata/static/chunks/13.2d06442dd9a05d9777b5.js.map,sha256=IcMWoAT9iK-5WSBWXHHpiw7U-21r5K63vZ7Cj5SkMEU,2430624
461
+ udata/static/chunks/13.f29411b06be1883356a3.js,sha256=QbmoNI_MwccyLEaOLPe4KyWDA5mrQRrRaGd9Z72zQp0,420590
462
+ udata/static/chunks/13.f29411b06be1883356a3.js.map,sha256=dB1whN7IEM_S4baXdZTTOBnXTGuzdB3ZCT9xbQK5sao,2430624
463
463
  udata/static/chunks/14.bc3f6bc0a67517e7b30f.js,sha256=SLlPbF5r7gOcZKPibWUh5BmsKF1jN8FwOUbiZ8i76EU,290368
464
464
  udata/static/chunks/14.bc3f6bc0a67517e7b30f.js.map,sha256=3Lg42qlM8-ho4unygukS9WvltNoIDJkMuTP7erZmYEI,1636918
465
465
  udata/static/chunks/15.2f5d8e3d4aa4c46188d7.js,sha256=gcYH_y6xCl3LbMKg_epxR5IntnEk7X119Evs9up1i7Q,138967
466
466
  udata/static/chunks/15.2f5d8e3d4aa4c46188d7.js.map,sha256=RPoT4EwQaWz3-puzfSV9kx511PK7RYPmveQFImM2BgA,702620
467
467
  udata/static/chunks/16.aaa39ef2d7e82594efc8.js,sha256=1J9T7hgzq1culb_vcXcRvMwt59pJx5Yv-oTU8mUoQDs,228559
468
468
  udata/static/chunks/16.aaa39ef2d7e82594efc8.js.map,sha256=Oc67ghT4gTY2r8H_cfy3tS6o-WyjvXkVc4xXqq0yBcQ,1574395
469
- udata/static/chunks/17.e8e4caaad5cb0cc0bacc.js,sha256=cLZ0lVide63WZtCnnvPsFeptXcONCL4zUj2IqJEiayQ,236702
470
- udata/static/chunks/17.e8e4caaad5cb0cc0bacc.js.map,sha256=yqRNQCYLIt7dpCJf_E7kLPiCnsFA20KIBkIBcZjJqUg,1289996
469
+ udata/static/chunks/17.3bd0340930d4a314ce9c.js,sha256=GWiultMJSKhkUkGbVAcSGUe1wg_AGWfgGmtb7HcH_eI,236702
470
+ udata/static/chunks/17.3bd0340930d4a314ce9c.js.map,sha256=2vbovBs6N5jhEwnxLB4jTyZYgvsdG_KS7p9_ILBJ46w,1289996
471
471
  udata/static/chunks/18.56444ebd2456a4ba2201.js,sha256=o78S_10_0k6kL0HbpDlbKZ5tZ-DCe6Y9XBex-SFS_s4,50384
472
472
  udata/static/chunks/18.56444ebd2456a4ba2201.js.map,sha256=Xdv5UJ1TG-LZIlUjZm-yv59KA1omSq2dr8Ukfec46UE,277805
473
- udata/static/chunks/19.f03a102365af4315f9db.js,sha256=AoAGY4OVQWkRqV6zhrmmRVIRBbVehJPBjcPN0g7avtA,203418
474
- udata/static/chunks/19.f03a102365af4315f9db.js.map,sha256=a9cN0YUEECSmeeY9Svl1tb0tzatGEUm6lRcPUkqiX6U,1079969
473
+ udata/static/chunks/19.3e0e8651d948e04b8cf2.js,sha256=ySPZmwSQKsC1U0DwFwdYQr4K3SCBIMgiDedcWjd7xwE,203418
474
+ udata/static/chunks/19.3e0e8651d948e04b8cf2.js.map,sha256=P7EVOtJ1v24m9jQtn9BhVM0PecjNl6udrO2ms1xWtFk,1079969
475
475
  udata/static/chunks/2.c67aa76cc078c193aed5.js,sha256=BjpQndwBdg9AT2lrY1TAgMfPbMvRytp33yI9YOgCOqc,276597
476
476
  udata/static/chunks/2.c67aa76cc078c193aed5.js.map,sha256=FnPh12lCwilnq1jRp-d7226H5kpaA4-raWEk1Q0p42M,1556097
477
477
  udata/static/chunks/20.3d4e02d1205a3c9e26c5.js,sha256=hRFQGBcks3lD-R4mNcNelqbr9kjz8jTtPee1lDWAVhY,36764
@@ -508,10 +508,10 @@ udata/static/chunks/6.d663709d877baa44a71e.js,sha256=hVRqq0dmyZJ8w6MdO9wUftY_doZ
508
508
  udata/static/chunks/6.d663709d877baa44a71e.js.map,sha256=WlChg1hCzjGyTO2mbICQpPhH5i7fjRC6ajr3g6unbtc,3783190
509
509
  udata/static/chunks/7.896bbffe39433bb598f7.js,sha256=C1NrGe6wrptQFYCCmITtx12dGqfaO7136-9BD6m05Ts,157150
510
510
  udata/static/chunks/7.896bbffe39433bb598f7.js.map,sha256=aZB8qYRkX4oqSugjG69tMlv64YIW5LPXF_8uACMHMTw,813014
511
- udata/static/chunks/8.778091d55cd8ea39af6b.js,sha256=SrK8Nvj5fUkQfnPzqJZk-C2_XIWJ8hWNGMyb12XzCXA,222856
512
- udata/static/chunks/8.778091d55cd8ea39af6b.js.map,sha256=FAp8U0UsvYUBz_r7pNmJUQU3UtTtpJPWaTG44Jl3fDk,1205076
513
- udata/static/chunks/9.033d7e190ca9e226a5d0.js,sha256=NmyhScUINZKQbc3A-zIZr9vEGy59Ktb9xkI-d0oaEvo,416716
514
- udata/static/chunks/9.033d7e190ca9e226a5d0.js.map,sha256=n08Lnx4NZFACwgehhaZfstLOnqDam_IUQhNLlUjMEVo,2746303
511
+ udata/static/chunks/8.494b003a94383b142c18.js,sha256=e22kCx2kIrqp7Ok5RWIYMbdVjL1Y3_MMddm0wOerUgs,222856
512
+ udata/static/chunks/8.494b003a94383b142c18.js.map,sha256=XAsFe6qlreG7vQyxmTU7J4JjSxyJvsyp9MjQZXdW13k,1205076
513
+ udata/static/chunks/9.07515e5187f475bce828.js,sha256=mJ8H3nJBaPXY1-hxWPdOD8-hQwP3k6prsfPwf_5wuas,416716
514
+ udata/static/chunks/9.07515e5187f475bce828.js.map,sha256=7cfRtXVGvJwrNXWVE8xaLjvQQoy9xgR6fIOmlPDJSDA,2746303
515
515
  udata/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
516
516
  udata/storage/s3.py,sha256=enxbTm1IZksiKLkbafASrO2bqO44OTCn4F7_FeMjhgg,1557
517
517
  udata/templates/admin.html,sha256=RfX03rUOW7NIlgMYNhFfx0pL-p2j8BtAKvEFUadaIIs,787
@@ -525,6 +525,8 @@ udata/templates/macros/forms.html,sha256=Zn8G_pRC9F7HFoA7sXh_P2xFbsXOTBRPbRO-PUY
525
525
  udata/templates/macros/metadata.html,sha256=KAKOYUvf50GpM1hm1O-HoV-1bhjW7aLqJdflDlNyf0U,3575
526
526
  udata/templates/mail/account_deleted.html,sha256=7INK4GqaOyqe36pXiT4xU_cAZLuNxOeY3zoy4Yjz1R4,146
527
527
  udata/templates/mail/account_deleted.txt,sha256=4EmPnt4QWMWSUkfTaMUga4BCFjGlZGKTgh9JDUzKjDk,110
528
+ udata/templates/mail/account_inactivity.html,sha256=oNYp1A8V48CYJTCP6GQ2Odkd9tJa6AB9DxWyipFJQAg,828
529
+ udata/templates/mail/account_inactivity.txt,sha256=AtfeM8nonj_XnqtMxd4XmVriOwNRGQLRL6xYpqryoEE,582
528
530
  udata/templates/mail/badge_added_association.html,sha256=xaF9tY20MbcVY_97tLK1l0OQe33bYVMdjXFPBZ7uhnc,860
529
531
  udata/templates/mail/badge_added_association.txt,sha256=o9ZIP6OB8Sf4sHjUY615ezU5WU6SVJqNkivdSgWViw4,301
530
532
  udata/templates/mail/badge_added_certified.html,sha256=6THD3JB7Qq-mFrb4pHTzLw7o1GiWQdpsyEr3QRtcu0g,841
@@ -542,6 +544,8 @@ udata/templates/mail/discussion_closed.html,sha256=cBLo3DeMg_WDJOQMJK7iDVoZF8Cz2
542
544
  udata/templates/mail/discussion_closed.txt,sha256=WKEqBKxgGtuuBB-Cm5-TavpYRUW9uh-aCM-AvWgTZSY,394
543
545
  udata/templates/mail/frequency_reminder.html,sha256=pP42w9H6UrL3kfYLqNbLFRMa-QHpdw4DoWLV8bsOPqQ,1192
544
546
  udata/templates/mail/frequency_reminder.txt,sha256=8F5RaIWsXRY74QjynEGxvVkIlRtRJpVr2rU-89hJi4c,734
547
+ udata/templates/mail/inactive_account_deleted.html,sha256=W27Os2tZioe7Ip4ZxHswNq8TAls1U0emZEHK4Qo2Kpc,196
548
+ udata/templates/mail/inactive_account_deleted.txt,sha256=7-7QU2v4CgoT2Vt8YkEbRsywiM-mAvGvdeB4_OIM2G8,160
545
549
  udata/templates/mail/membership_refused.html,sha256=_Q5fC85icJJirRpWN4Kls5rd3YWfxIj2CZVUGwbZNso,611
546
550
  udata/templates/mail/membership_refused.txt,sha256=rXur42ZD3W65SCblUrZqMK34RHz0oSYL4-rb_kKmE0g,217
547
551
  udata/templates/mail/membership_request.html,sha256=5eyw4wF9rHmZ2zw_i2_voqPlaKYh0vDS5Ys1I8pH4Zc,1405
@@ -619,7 +623,7 @@ udata/tests/api/test_dataservices_api.py,sha256=DAOMW1nkETWz2r3JoQ9bN8n-V72HJFr4
619
623
  udata/tests/api/test_datasets_api.py,sha256=YRjyUfhfOAXFPH9v8jvqeZv-R9clRcoDCpftgRJ17is,88400
620
624
  udata/tests/api/test_fields.py,sha256=OW85Z5MES5HeWOpapeem8OvR1cIcrqW-xMWpdZO4LZ8,1033
621
625
  udata/tests/api/test_follow_api.py,sha256=fccgVNfcqET221PPS3p7qzb9hpvbBBUGhV-l4UeOpyk,3352
622
- udata/tests/api/test_me_api.py,sha256=ZJKGH9fFv-4cSGcYAGd6IJA_PwPjVGIqWNy_DhFA8ms,13827
626
+ udata/tests/api/test_me_api.py,sha256=YPd8zmR3zwJKtpSqz8nY1nOOMyXs66INeBwyhg5D0Us,13846
623
627
  udata/tests/api/test_organizations_api.py,sha256=jDCGw5BZ2Ps6S1xxp5hRi8XsrmR8DE22tflRPGtUYcc,37527
624
628
  udata/tests/api/test_reports_api.py,sha256=fCSz9NwMXBs6cxdXBVVI6y564AtovmZYw3xkgxQ9KE8,6217
625
629
  udata/tests/api/test_reuses_api.py,sha256=d8mtUrDURIfnUK-sLogvAP-rOID2FDJ0UVTM0ravQ-Q,24642
@@ -627,7 +631,7 @@ udata/tests/api/test_swagger.py,sha256=eE6La9qdTYTIUFevRVPJgtj17Jq_8uOlsDwzCNR0L
627
631
  udata/tests/api/test_tags_api.py,sha256=36zEBgthVEn6pctJ0kDgPmEaUr-iqRAHeZRcRG2LEXQ,2425
628
632
  udata/tests/api/test_topics_api.py,sha256=L2zisaASayFca3Vu0Y3GKMSwmZH1aosklK2TXuMcyXE,11037
629
633
  udata/tests/api/test_transfer_api.py,sha256=-OLv-KjyLZL14J8UHl-ak_sYUj6wFiZWyoXC2SMXmEQ,7503
630
- udata/tests/api/test_user_api.py,sha256=Wsfe7MVABvmKoKuh-yamxWgWdu9sCmB8J_je4H-O0jw,15036
634
+ udata/tests/api/test_user_api.py,sha256=hfDHOv5F81tehbc5u3dYH5rAyYgzgHGCWVcGR3kLIZw,16591
631
635
  udata/tests/apiv2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
632
636
  udata/tests/apiv2/test_datasets.py,sha256=c6Keni4GWujVseem-wbvlq92yL4XHY6C1_tD7TlqXWI,20799
633
637
  udata/tests/apiv2/test_me_api.py,sha256=RAgu5iKGB3Pp8cDN-427ovly-VOz5MTL4GpPZ1NcVXI,1418
@@ -694,6 +698,7 @@ udata/tests/site/test_site_model.py,sha256=zpRg5jrFPUwhGsljlO5lpCrhJLHiHYoNl28AO
694
698
  udata/tests/site/test_site_rdf.py,sha256=zlw7leYc7azfrC6JwDjKiy3wixQzTpo-lDOm-Dg_kXw,13092
695
699
  udata/tests/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
696
700
  udata/tests/user/test_user_rdf.py,sha256=BRdv9ivLLUQoImFOuIohDoZAQXMXCruaNJ37siKul5o,1771
701
+ udata/tests/user/test_user_tasks.py,sha256=6BzNaD94YiRHJWwDwcRlGC9au7dfiDvIoout08T5rlU,5601
697
702
  udata/tests/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
698
703
  udata/tests/workers/test_jobs_commands.py,sha256=TAfJUUPBSkwtFHZpIa6k9n-o_SUni7q4bQsiuXXuqGY,5463
699
704
  udata/tests/workers/test_tasks_routing.py,sha256=m7Zu9X7GW3oKkSDcHM-dC20Vba3Fruui44bMBVU1dcc,2228
@@ -714,9 +719,9 @@ udata/translations/pt/LC_MESSAGES/udata.mo,sha256=la3r9RfO2YaMB0d08RN1Q5PinPJ-2O
714
719
  udata/translations/pt/LC_MESSAGES/udata.po,sha256=ulvjehujnC0o5Ne7h5rGcgZOC2th6VrXmCKuF8VsPBQ,45374
715
720
  udata/translations/sr/LC_MESSAGES/udata.mo,sha256=6SvkI34FzFuEfihx6kWbCS6PdL2Zd6i_-fsuY8wG3U8,29169
716
721
  udata/translations/sr/LC_MESSAGES/udata.po,sha256=ISzXelZSWZ9BwN6ij7QA7T-2nFKUD4mqs9AgM1Xg4nk,52349
717
- udata-10.1.3.dev34283.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
718
- udata-10.1.3.dev34283.dist-info/METADATA,sha256=rMQnmmtK0loU_yMnjMfAQAKNMQsGMbMP1_tIXgRqWDk,141936
719
- udata-10.1.3.dev34283.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
720
- udata-10.1.3.dev34283.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
721
- udata-10.1.3.dev34283.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
722
- udata-10.1.3.dev34283.dist-info/RECORD,,
722
+ udata-10.1.3.dev34303.dist-info/LICENSE,sha256=V8j_M8nAz8PvAOZQocyRDX7keai8UJ9skgmnwqETmdY,34520
723
+ udata-10.1.3.dev34303.dist-info/METADATA,sha256=0OkW7znqIcvIT32EHPfdAVd1MUMnvQWEAT7__GXZJbc,142188
724
+ udata-10.1.3.dev34303.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
725
+ udata-10.1.3.dev34303.dist-info/entry_points.txt,sha256=3SKiqVy4HUqxf6iWspgMqH8d88Htk6KoLbG1BU-UddQ,451
726
+ udata-10.1.3.dev34303.dist-info/top_level.txt,sha256=39OCg-VWFWOq4gCKnjKNu-s3OwFlZIu_dVH8Gl6ndHw,12
727
+ udata-10.1.3.dev34303.dist-info/RECORD,,