Compare commits
33 Commits
ed6879b7f1
...
master
Author | SHA1 | Date | |
---|---|---|---|
4663b4c026 | |||
1a581420fa | |||
ac39be54cc | |||
7a74048f57 | |||
18d7c8e56a | |||
330515d8c4 | |||
95a0c7e842 | |||
d4fd598923 | |||
36f5d7a77f | |||
ba2c1e3b0f | |||
07ac60e228 | |||
bfc50aba46 | |||
a188d48c89 | |||
7540f4f18a | |||
5dcec4dfc6 | |||
e601ed70c2 | |||
4998290549 | |||
8d479aa6b3 | |||
9d4f8df207 | |||
c79a6068e9 | |||
a49f192125 | |||
ddbc36b8aa | |||
a321a69336 | |||
5100c8b922 | |||
12176aabf4 | |||
66a2aab6b7 | |||
2cd502caa5 | |||
65f3d73a47 | |||
7c4ca62a2d | |||
de2e200551 | |||
c3671d0cae | |||
a7f5635440 | |||
b048ef44c5 |
Binary file not shown.
@ -15,6 +15,7 @@ Here you can read more information about the Poliklinieken Planning Tool.
|
||||
|
||||
install
|
||||
models
|
||||
views
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
6
doc/views.rst
Normal file
6
doc/views.rst
Normal file
@ -0,0 +1,6 @@
|
||||
======
|
||||
Vieuws
|
||||
======
|
||||
|
||||
.. automodule:: apps.schedule.views
|
||||
:members:
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -42,7 +42,7 @@ msgstr ""
|
||||
msgid "Welcome at RUG"
|
||||
msgstr ""
|
||||
|
||||
#: apps/RUG_template/templates/base.html:85
|
||||
#: apps/RUG_template/templates/base.html:83
|
||||
msgid "Language selection"
|
||||
msgstr ""
|
||||
|
||||
@ -147,7 +147,7 @@ msgid ""
|
||||
"\n"
|
||||
"%(protocol)s://%(domain)s%(reset_url)s\n"
|
||||
"\n"
|
||||
"Your username, in case you’ve forgotten: %(user)s\n"
|
||||
"Your username, in case you've forgotten: %(user)s\n"
|
||||
"\n"
|
||||
"Thanks for using our site!\n"
|
||||
"\n"
|
||||
|
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"PO-Revision-Date: 2020-05-15 12:52+0200\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-05-19 12:05+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: nl\n"
|
||||
@ -42,7 +42,7 @@ msgstr "Logouit"
|
||||
msgid "Welcome at RUG"
|
||||
msgstr "Welkom bij de RUG"
|
||||
|
||||
#: apps/RUG_template/templates/base.html:85
|
||||
#: apps/RUG_template/templates/base.html:83
|
||||
msgid "Language selection"
|
||||
msgstr "Taal keuze"
|
||||
|
||||
@ -155,7 +155,7 @@ msgid ""
|
||||
"\n"
|
||||
"%(protocol)s://%(domain)s%(reset_url)s\n"
|
||||
"\n"
|
||||
"Your username, in case you’ve forgotten: %(user)s\n"
|
||||
"Your username, in case you've forgotten: %(user)s\n"
|
||||
"\n"
|
||||
"Thanks for using our site!\n"
|
||||
"\n"
|
||||
@ -168,7 +168,7 @@ msgstr ""
|
||||
"\n"
|
||||
"%(protocol)s://%(domain)s%(reset_url)s\n"
|
||||
"\n"
|
||||
"Uw gebruikersnaam, voor het geval u het bent vergeten:%(user)s\n"
|
||||
"Uw gebruikersnaam, voor het geval u het bent vergeten: %(user)s\n"
|
||||
"\n"
|
||||
"Bedankt voor het gebruiken van onze site!\n"
|
||||
"\n"
|
||||
|
38
polyclinic_scheduling/apps/RUG_template/middleware.py
Normal file
38
polyclinic_scheduling/apps/RUG_template/middleware.py
Normal file
@ -0,0 +1,38 @@
|
||||
import pytz
|
||||
import requests
|
||||
|
||||
from ipware import get_client_ip
|
||||
from django.utils import timezone
|
||||
|
||||
# make sure you add `TimezoneMiddleware` appropriately in settings.py: 'apps.RUG_template.middleware.TimezoneMiddleware'
|
||||
class TimezoneMiddleware:
|
||||
""" Middleware to check user timezone. """
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
# One-time configuration and initialization.
|
||||
|
||||
def __call__(self, request):
|
||||
# Code to be executed for each request before
|
||||
# the view (and later middleware) are called.
|
||||
client_ip, is_routable = get_client_ip(request)
|
||||
user_time_zone = request.session.get('user_time_zone', None)
|
||||
try:
|
||||
if user_time_zone is None and is_routable and client_ip is not None:
|
||||
# Here we use an online service to get visitor info. Maybe not the nicest way to do it, but it is a way
|
||||
# Also we only check when we get a public IP address. Local networks will not be checked online
|
||||
# https://freegeoip.app
|
||||
freegeoip_response = requests.get('https://freegeoip.app/json/{0}'.format(client_ip))
|
||||
freegeoip_response_json = freegeoip_response.json()
|
||||
user_time_zone = freegeoip_response_json['time_zone']
|
||||
if user_time_zone:
|
||||
request.session['user_time_zone'] = user_time_zone
|
||||
timezone.activate(pytz.timezone(user_time_zone))
|
||||
except:
|
||||
pass
|
||||
|
||||
response = self.get_response(request)
|
||||
|
||||
# Code to be executed for each request/response after
|
||||
# the view is called.
|
||||
|
||||
return response
|
@ -31,7 +31,11 @@ table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
form#new_schedule_form input {
|
||||
.pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
form#new_schedule_form input:not([type=checkbox]) {
|
||||
width: 100%
|
||||
}
|
||||
|
||||
|
18
polyclinic_scheduling/apps/RUG_template/static/RUG_template/javascript/formdata.min.js
vendored
Normal file
18
polyclinic_scheduling/apps/RUG_template/static/RUG_template/javascript/formdata.min.js
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
;(function(){var k;function m(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var p="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function r(){r=function(){};q.Symbol||(q.Symbol=u)}function v(a,b){this.s=a;p(this,"description",{configurable:!0,writable:!0,value:b})}
|
||||
v.prototype.toString=function(){return this.s};var u=function(){function a(c){if(this instanceof a)throw new TypeError("Symbol is not a constructor");return new v("jscomp_symbol_"+(c||"")+"_"+b++,c)}var b=0;return a}();function w(){r();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("Symbol.iterator"));"function"!=typeof Array.prototype[a]&&p(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return x(m(this))}});w=function(){}}
|
||||
function x(a){w();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function y(a){var b="undefined"!=typeof Symbol&&Symbol.iterator&&a[Symbol.iterator];return b?b.call(a):{next:m(a)}}var z;if("function"==typeof Object.setPrototypeOf)z=Object.setPrototypeOf;else{var A;a:{var B={v:!0},C={};try{C.__proto__=B;A=C.v;break a}catch(a){}A=!1}z=A?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var D=z;
|
||||
function E(){this.h=!1;this.c=null;this.o=void 0;this.b=1;this.m=this.w=0;this.g=null}function F(a){if(a.h)throw new TypeError("Generator is already running");a.h=!0}E.prototype.i=function(a){this.o=a};E.prototype.j=function(a){this.g={A:a,B:!0};this.b=this.w||this.m};E.prototype["return"]=function(a){this.g={"return":a};this.b=this.m};function G(a,b,c){a.b=c;return{value:b}}function H(a){this.C=a;this.l=[];for(var b in a)this.l.push(b);this.l.reverse()}function I(a){this.a=new E;this.D=a}
|
||||
I.prototype.i=function(a){F(this.a);if(this.a.c)return J(this,this.a.c.next,a,this.a.i);this.a.i(a);return K(this)};function L(a,b){F(a.a);var c=a.a.c;if(c)return J(a,"return"in c?c["return"]:function(d){return{value:d,done:!0}},b,a.a["return"]);a.a["return"](b);return K(a)}I.prototype.j=function(a){F(this.a);if(this.a.c)return J(this,this.a.c["throw"],a,this.a.i);this.a.j(a);return K(this)};
|
||||
function J(a,b,c,d){try{var e=b.call(a.a.c,c);if(!(e instanceof Object))throw new TypeError("Iterator result "+e+" is not an object");if(!e.done)return a.a.h=!1,e;var f=e.value}catch(g){return a.a.c=null,a.a.j(g),K(a)}a.a.c=null;d.call(a.a,f);return K(a)}function K(a){for(;a.a.b;)try{var b=a.D(a.a);if(b)return a.a.h=!1,{value:b.value,done:!1}}catch(c){a.a.o=void 0,a.a.j(c)}a.a.h=!1;if(a.a.g){b=a.a.g;a.a.g=null;if(b.B)throw b.A;return{value:b["return"],done:!0}}return{value:void 0,done:!0}}
|
||||
function M(a){this.next=function(b){return a.i(b)};this["throw"]=function(b){return a.j(b)};this["return"]=function(b){return L(a,b)};w();this[Symbol.iterator]=function(){return this}}function N(a,b){var c=new M(new I(b));D&&D(c,a.prototype);return c}
|
||||
if("undefined"!==typeof Blob&&("undefined"===typeof FormData||!FormData.prototype.keys)){var O=function(a,b){for(var c=0;c<a.length;c++)b(a[c])},P=function(a,b,c){return b instanceof Blob?[String(a),b,void 0!==c?c+"":"string"===typeof b.name?b.name:"blob"]:[String(a),String(b)]},Q=function(a,b){if(a.length<b)throw new TypeError(b+" argument required, but only "+a.length+" present.");},S=function(a){var b=y(a);a=b.next().value;b=b.next().value;a instanceof Blob&&(a=new File([a],b,{type:a.type,lastModified:a.lastModified}));
|
||||
return a},T="object"===typeof window?window:"object"===typeof self?self:this,U=T.FormData,V=T.XMLHttpRequest&&T.XMLHttpRequest.prototype.send,W=T.Request&&T.fetch,X=T.navigator&&T.navigator.sendBeacon;r();var Y=T.Symbol&&Symbol.toStringTag;Y&&(Blob.prototype[Y]||(Blob.prototype[Y]="Blob"),"File"in T&&!File.prototype[Y]&&(File.prototype[Y]="File"));try{new File([],"")}catch(a){T.File=function(b,c,d){b=new Blob(b,d);d=d&&void 0!==d.lastModified?new Date(d.lastModified):new Date;Object.defineProperties(b,
|
||||
{name:{value:c},lastModifiedDate:{value:d},lastModified:{value:+d},toString:{value:function(){return"[object File]"}}});Y&&Object.defineProperty(b,Y,{value:"File"});return b}}r();w();var Z=function(a){this.f=Object.create(null);if(!a)return this;var b=this;O(a.elements,function(c){if(c.name&&!c.disabled&&"submit"!==c.type&&"button"!==c.type)if("file"===c.type){var d=c.files&&c.files.length?c.files:[new File([],"",{type:"application/octet-stream"})];O(d,function(e){b.append(c.name,e)})}else"select-multiple"===
|
||||
c.type||"select-one"===c.type?O(c.options,function(e){!e.disabled&&e.selected&&b.append(c.name,e.value)}):"checkbox"===c.type||"radio"===c.type?c.checked&&b.append(c.name,c.value):(d="textarea"===c.type?c.value.replace(/\r\n/g,"\n").replace(/\n/g,"\r\n"):c.value,b.append(c.name,d))})};k=Z.prototype;k.append=function(a,b,c){Q(arguments,2);var d=y(P.apply(null,arguments));a=d.next().value;b=d.next().value;c=d.next().value;d=this.f;d[a]||(d[a]=[]);d[a].push([b,c])};k["delete"]=function(a){Q(arguments,
|
||||
1);delete this.f[String(a)]};k.entries=function b(){var c=this,d,e,f,g,h,t;return N(b,function(l){switch(l.b){case 1:d=c.f,f=new H(d);case 2:var n;a:{for(n=f;0<n.l.length;){var R=n.l.pop();if(R in n.C){n=R;break a}}n=null}if(null==(e=n)){l.b=0;break}g=y(d[e]);h=g.next();case 5:if(h.done){l.b=2;break}t=h.value;return G(l,[e,S(t)],6);case 6:h=g.next(),l.b=5}})};k.forEach=function(b,c){Q(arguments,1);for(var d=y(this),e=d.next();!e.done;e=d.next()){var f=y(e.value);e=f.next().value;f=f.next().value;
|
||||
b.call(c,f,e,this)}};k.get=function(b){Q(arguments,1);var c=this.f;b=String(b);return c[b]?S(c[b][0]):null};k.getAll=function(b){Q(arguments,1);return(this.f[String(b)]||[]).map(S)};k.has=function(b){Q(arguments,1);return String(b)in this.f};k.keys=function c(){var d=this,e,f,g,h,t;return N(c,function(l){1==l.b&&(e=y(d),f=e.next());if(3!=l.b){if(f.done){l.b=0;return}g=f.value;h=y(g);t=h.next().value;return G(l,t,3)}f=e.next();l.b=2})};k.set=function(c,d,e){Q(arguments,2);var f=P.apply(null,arguments);
|
||||
this.f[f[0]]=[[f[1],f[2]]]};k.values=function d(){var e=this,f,g,h,t,l;return N(d,function(n){1==n.b&&(f=y(e),g=f.next());if(3!=n.b){if(g.done){n.b=0;return}h=g.value;t=y(h);t.next();l=t.next().value;return G(n,l,3)}g=f.next();n.b=2})};Z.prototype._asNative=function(){for(var d=new U,e=y(this),f=e.next();!f.done;f=e.next()){var g=y(f.value);f=g.next().value;g=g.next().value;d.append(f,g)}return d};Z.prototype._blob=function(){for(var d="----formdata-polyfill-"+Math.random(),e=[],f=y(this),g=f.next();!g.done;g=
|
||||
f.next()){var h=y(g.value);g=h.next().value;h=h.next().value;e.push("--"+d+"\r\n");h instanceof Blob?e.push('Content-Disposition: form-data; name="'+g+'"; filename="'+h.name+'"\r\n',"Content-Type: "+(h.type||"application/octet-stream")+"\r\n\r\n",h,"\r\n"):e.push('Content-Disposition: form-data; name="'+g+'"\r\n\r\n'+h+"\r\n")}e.push("--"+d+"--");return new Blob(e,{type:"multipart/form-data; boundary="+d})};Z.prototype[Symbol.iterator]=function(){return this.entries()};Z.prototype.toString=function(){return"[object FormData]"};
|
||||
Y&&(Z.prototype[Y]="FormData");if(V){var aa=T.XMLHttpRequest.prototype.setRequestHeader;T.XMLHttpRequest.prototype.setRequestHeader=function(d,e){aa.call(this,d,e);"content-type"===d.toLowerCase()&&(this.u=!0)};T.XMLHttpRequest.prototype.send=function(d){d instanceof Z?(d=d._blob(),this.u||this.setRequestHeader("Content-Type",d.type),V.call(this,d)):V.call(this,d)}}if(W){var ba=T.fetch;T.fetch=function(d,e){e&&e.body&&e.body instanceof Z&&(e.body=e.body._blob());return ba.call(this,d,e)}}X&&(T.navigator.sendBeacon=
|
||||
function(d,e){e instanceof Z&&(e=e._asNative());return X.call(this,d,e)});T.FormData=Z};
|
||||
})();
|
@ -0,0 +1,806 @@
|
||||
// HumanizeDuration.js - https://git.io/j0HgmQ
|
||||
|
||||
;(function () {
|
||||
// This has to be defined separately because of a bug: we want to alias
|
||||
// `gr` and `el` for backwards-compatiblity. In a breaking change, we can
|
||||
// remove `gr` entirely.
|
||||
// See https://github.com/EvanHahn/HumanizeDuration.js/issues/143 for more.
|
||||
var greek = {
|
||||
y: function (c) { return c === 1 ? 'χρόνος' : 'χρόνια' },
|
||||
mo: function (c) { return c === 1 ? 'μήνας' : 'μήνες' },
|
||||
w: function (c) { return c === 1 ? 'εβδομάδα' : 'εβδομάδες' },
|
||||
d: function (c) { return c === 1 ? 'μέρα' : 'μέρες' },
|
||||
h: function (c) { return c === 1 ? 'ώρα' : 'ώρες' },
|
||||
m: function (c) { return c === 1 ? 'λεπτό' : 'λεπτά' },
|
||||
s: function (c) { return c === 1 ? 'δευτερόλεπτο' : 'δευτερόλεπτα' },
|
||||
ms: function (c) { return c === 1 ? 'χιλιοστό του δευτερολέπτου' : 'χιλιοστά του δευτερολέπτου' },
|
||||
decimal: ','
|
||||
}
|
||||
|
||||
var languages = {
|
||||
ar: {
|
||||
y: function (c) { return c === 1 ? 'سنة' : 'سنوات' },
|
||||
mo: function (c) { return c === 1 ? 'شهر' : 'أشهر' },
|
||||
w: function (c) { return c === 1 ? 'أسبوع' : 'أسابيع' },
|
||||
d: function (c) { return c === 1 ? 'يوم' : 'أيام' },
|
||||
h: function (c) { return c === 1 ? 'ساعة' : 'ساعات' },
|
||||
m: function (c) {
|
||||
return ['دقيقة', 'دقائق'][getArabicForm(c)]
|
||||
},
|
||||
s: function (c) { return c === 1 ? 'ثانية' : 'ثواني' },
|
||||
ms: function (c) { return c === 1 ? 'جزء من الثانية' : 'أجزاء من الثانية' },
|
||||
decimal: ','
|
||||
},
|
||||
bg: {
|
||||
y: function (c) { return ['години', 'година', 'години'][getSlavicForm(c)] },
|
||||
mo: function (c) { return ['месеца', 'месец', 'месеца'][getSlavicForm(c)] },
|
||||
w: function (c) { return ['седмици', 'седмица', 'седмици'][getSlavicForm(c)] },
|
||||
d: function (c) { return ['дни', 'ден', 'дни'][getSlavicForm(c)] },
|
||||
h: function (c) { return ['часа', 'час', 'часа'][getSlavicForm(c)] },
|
||||
m: function (c) { return ['минути', 'минута', 'минути'][getSlavicForm(c)] },
|
||||
s: function (c) { return ['секунди', 'секунда', 'секунди'][getSlavicForm(c)] },
|
||||
ms: function (c) { return ['милисекунди', 'милисекунда', 'милисекунди'][getSlavicForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
ca: {
|
||||
y: function (c) { return 'any' + (c === 1 ? '' : 's') },
|
||||
mo: function (c) { return 'mes' + (c === 1 ? '' : 'os') },
|
||||
w: function (c) { return 'setman' + (c === 1 ? 'a' : 'es') },
|
||||
d: function (c) { return 'di' + (c === 1 ? 'a' : 'es') },
|
||||
h: function (c) { return 'hor' + (c === 1 ? 'a' : 'es') },
|
||||
m: function (c) { return 'minut' + (c === 1 ? '' : 's') },
|
||||
s: function (c) { return 'segon' + (c === 1 ? '' : 's') },
|
||||
ms: function (c) { return 'milisegon' + (c === 1 ? '' : 's') },
|
||||
decimal: ','
|
||||
},
|
||||
cs: {
|
||||
y: function (c) { return ['rok', 'roku', 'roky', 'let'][getCzechOrSlovakForm(c)] },
|
||||
mo: function (c) { return ['měsíc', 'měsíce', 'měsíce', 'měsíců'][getCzechOrSlovakForm(c)] },
|
||||
w: function (c) { return ['týden', 'týdne', 'týdny', 'týdnů'][getCzechOrSlovakForm(c)] },
|
||||
d: function (c) { return ['den', 'dne', 'dny', 'dní'][getCzechOrSlovakForm(c)] },
|
||||
h: function (c) { return ['hodina', 'hodiny', 'hodiny', 'hodin'][getCzechOrSlovakForm(c)] },
|
||||
m: function (c) { return ['minuta', 'minuty', 'minuty', 'minut'][getCzechOrSlovakForm(c)] },
|
||||
s: function (c) { return ['sekunda', 'sekundy', 'sekundy', 'sekund'][getCzechOrSlovakForm(c)] },
|
||||
ms: function (c) { return ['milisekunda', 'milisekundy', 'milisekundy', 'milisekund'][getCzechOrSlovakForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
da: {
|
||||
y: 'år',
|
||||
mo: function (c) { return 'måned' + (c === 1 ? '' : 'er') },
|
||||
w: function (c) { return 'uge' + (c === 1 ? '' : 'r') },
|
||||
d: function (c) { return 'dag' + (c === 1 ? '' : 'e') },
|
||||
h: function (c) { return 'time' + (c === 1 ? '' : 'r') },
|
||||
m: function (c) { return 'minut' + (c === 1 ? '' : 'ter') },
|
||||
s: function (c) { return 'sekund' + (c === 1 ? '' : 'er') },
|
||||
ms: function (c) { return 'millisekund' + (c === 1 ? '' : 'er') },
|
||||
decimal: ','
|
||||
},
|
||||
de: {
|
||||
y: function (c) { return 'Jahr' + (c === 1 ? '' : 'e') },
|
||||
mo: function (c) { return 'Monat' + (c === 1 ? '' : 'e') },
|
||||
w: function (c) { return 'Woche' + (c === 1 ? '' : 'n') },
|
||||
d: function (c) { return 'Tag' + (c === 1 ? '' : 'e') },
|
||||
h: function (c) { return 'Stunde' + (c === 1 ? '' : 'n') },
|
||||
m: function (c) { return 'Minute' + (c === 1 ? '' : 'n') },
|
||||
s: function (c) { return 'Sekunde' + (c === 1 ? '' : 'n') },
|
||||
ms: function (c) { return 'Millisekunde' + (c === 1 ? '' : 'n') },
|
||||
decimal: ','
|
||||
},
|
||||
el: greek,
|
||||
en: {
|
||||
y: function (c) { return 'year' + (c === 1 ? '' : 's') },
|
||||
mo: function (c) { return 'month' + (c === 1 ? '' : 's') },
|
||||
w: function (c) { return 'week' + (c === 1 ? '' : 's') },
|
||||
d: function (c) { return 'day' + (c === 1 ? '' : 's') },
|
||||
h: function (c) { return 'hour' + (c === 1 ? '' : 's') },
|
||||
m: function (c) { return 'minute' + (c === 1 ? '' : 's') },
|
||||
s: function (c) { return 'second' + (c === 1 ? '' : 's') },
|
||||
ms: function (c) { return 'millisecond' + (c === 1 ? '' : 's') },
|
||||
decimal: '.'
|
||||
},
|
||||
es: {
|
||||
y: function (c) { return 'año' + (c === 1 ? '' : 's') },
|
||||
mo: function (c) { return 'mes' + (c === 1 ? '' : 'es') },
|
||||
w: function (c) { return 'semana' + (c === 1 ? '' : 's') },
|
||||
d: function (c) { return 'día' + (c === 1 ? '' : 's') },
|
||||
h: function (c) { return 'hora' + (c === 1 ? '' : 's') },
|
||||
m: function (c) { return 'minuto' + (c === 1 ? '' : 's') },
|
||||
s: function (c) { return 'segundo' + (c === 1 ? '' : 's') },
|
||||
ms: function (c) { return 'milisegundo' + (c === 1 ? '' : 's') },
|
||||
decimal: ','
|
||||
},
|
||||
et: {
|
||||
y: function (c) { return 'aasta' + (c === 1 ? '' : 't') },
|
||||
mo: function (c) { return 'kuu' + (c === 1 ? '' : 'd') },
|
||||
w: function (c) { return 'nädal' + (c === 1 ? '' : 'at') },
|
||||
d: function (c) { return 'päev' + (c === 1 ? '' : 'a') },
|
||||
h: function (c) { return 'tund' + (c === 1 ? '' : 'i') },
|
||||
m: function (c) { return 'minut' + (c === 1 ? '' : 'it') },
|
||||
s: function (c) { return 'sekund' + (c === 1 ? '' : 'it') },
|
||||
ms: function (c) { return 'millisekund' + (c === 1 ? '' : 'it') },
|
||||
decimal: ','
|
||||
},
|
||||
fa: {
|
||||
y: 'سال',
|
||||
mo: 'ماه',
|
||||
w: 'هفته',
|
||||
d: 'روز',
|
||||
h: 'ساعت',
|
||||
m: 'دقیقه',
|
||||
s: 'ثانیه',
|
||||
ms: 'میلی ثانیه',
|
||||
decimal: '.'
|
||||
},
|
||||
fi: {
|
||||
y: function (c) { return c === 1 ? 'vuosi' : 'vuotta' },
|
||||
mo: function (c) { return c === 1 ? 'kuukausi' : 'kuukautta' },
|
||||
w: function (c) { return 'viikko' + (c === 1 ? '' : 'a') },
|
||||
d: function (c) { return 'päivä' + (c === 1 ? '' : 'ä') },
|
||||
h: function (c) { return 'tunti' + (c === 1 ? '' : 'a') },
|
||||
m: function (c) { return 'minuutti' + (c === 1 ? '' : 'a') },
|
||||
s: function (c) { return 'sekunti' + (c === 1 ? '' : 'a') },
|
||||
ms: function (c) { return 'millisekunti' + (c === 1 ? '' : 'a') },
|
||||
decimal: ','
|
||||
},
|
||||
fo: {
|
||||
y: 'ár',
|
||||
mo: function (c) { return c === 1 ? 'mánaður' : 'mánaðir' },
|
||||
w: function (c) { return c === 1 ? 'vika' : 'vikur' },
|
||||
d: function (c) { return c === 1 ? 'dagur' : 'dagar' },
|
||||
h: function (c) { return c === 1 ? 'tími' : 'tímar' },
|
||||
m: function (c) { return c === 1 ? 'minuttur' : 'minuttir' },
|
||||
s: 'sekund',
|
||||
ms: 'millisekund',
|
||||
decimal: ','
|
||||
},
|
||||
fr: {
|
||||
y: function (c) { return 'an' + (c >= 2 ? 's' : '') },
|
||||
mo: 'mois',
|
||||
w: function (c) { return 'semaine' + (c >= 2 ? 's' : '') },
|
||||
d: function (c) { return 'jour' + (c >= 2 ? 's' : '') },
|
||||
h: function (c) { return 'heure' + (c >= 2 ? 's' : '') },
|
||||
m: function (c) { return 'minute' + (c >= 2 ? 's' : '') },
|
||||
s: function (c) { return 'seconde' + (c >= 2 ? 's' : '') },
|
||||
ms: function (c) { return 'milliseconde' + (c >= 2 ? 's' : '') },
|
||||
decimal: ','
|
||||
},
|
||||
gr: greek,
|
||||
he: {
|
||||
y: function (c) { return c === 1 ? 'שנה' : 'שנים' },
|
||||
mo: function (c) { return c === 1 ? 'חודש' : 'חודשים' },
|
||||
w: function (c) { return c === 1 ? 'שבוע' : 'שבועות' },
|
||||
d: function (c) { return c === 1 ? 'יום' : 'ימים' },
|
||||
h: function (c) { return c === 1 ? 'שעה' : 'שעות' },
|
||||
m: function (c) { return c === 1 ? 'דקה' : 'דקות' },
|
||||
s: function (c) { return c === 1 ? 'שניה' : 'שניות' },
|
||||
ms: function (c) { return c === 1 ? 'מילישנייה' : 'מילישניות' },
|
||||
decimal: '.'
|
||||
},
|
||||
hr: {
|
||||
y: function (c) {
|
||||
if (c % 10 === 2 || c % 10 === 3 || c % 10 === 4) {
|
||||
return 'godine'
|
||||
}
|
||||
return 'godina'
|
||||
},
|
||||
mo: function (c) {
|
||||
if (c === 1) {
|
||||
return 'mjesec'
|
||||
} else if (c === 2 || c === 3 || c === 4) {
|
||||
return 'mjeseca'
|
||||
}
|
||||
return 'mjeseci'
|
||||
},
|
||||
w: function (c) {
|
||||
if (c % 10 === 1 && c !== 11) {
|
||||
return 'tjedan'
|
||||
}
|
||||
return 'tjedna'
|
||||
},
|
||||
d: function (c) { return c === 1 ? 'dan' : 'dana' },
|
||||
h: function (c) {
|
||||
if (c === 1) {
|
||||
return 'sat'
|
||||
} else if (c === 2 || c === 3 || c === 4) {
|
||||
return 'sata'
|
||||
}
|
||||
return 'sati'
|
||||
},
|
||||
m: function (c) {
|
||||
var mod10 = c % 10
|
||||
if ((mod10 === 2 || mod10 === 3 || mod10 === 4) && (c < 10 || c > 14)) {
|
||||
return 'minute'
|
||||
}
|
||||
return 'minuta'
|
||||
},
|
||||
s: function (c) {
|
||||
if ((c === 10 || c === 11 || c === 12 || c === 13 || c === 14 || c === 16 || c === 17 || c === 18 || c === 19) || (c % 10 === 5)) {
|
||||
return 'sekundi'
|
||||
} else if (c % 10 === 1) {
|
||||
return 'sekunda'
|
||||
} else if (c % 10 === 2 || c % 10 === 3 || c % 10 === 4) {
|
||||
return 'sekunde'
|
||||
}
|
||||
return 'sekundi'
|
||||
},
|
||||
ms: function (c) {
|
||||
if (c === 1) {
|
||||
return 'milisekunda'
|
||||
} else if (c % 10 === 2 || c % 10 === 3 || c % 10 === 4) {
|
||||
return 'milisekunde'
|
||||
}
|
||||
return 'milisekundi'
|
||||
},
|
||||
decimal: ','
|
||||
},
|
||||
hu: {
|
||||
y: 'év',
|
||||
mo: 'hónap',
|
||||
w: 'hét',
|
||||
d: 'nap',
|
||||
h: 'óra',
|
||||
m: 'perc',
|
||||
s: 'másodperc',
|
||||
ms: 'ezredmásodperc',
|
||||
decimal: ','
|
||||
},
|
||||
id: {
|
||||
y: 'tahun',
|
||||
mo: 'bulan',
|
||||
w: 'minggu',
|
||||
d: 'hari',
|
||||
h: 'jam',
|
||||
m: 'menit',
|
||||
s: 'detik',
|
||||
ms: 'milidetik',
|
||||
decimal: '.'
|
||||
},
|
||||
is: {
|
||||
y: 'ár',
|
||||
mo: function (c) { return 'mánuð' + (c === 1 ? 'ur' : 'ir') },
|
||||
w: function (c) { return 'vik' + (c === 1 ? 'a' : 'ur') },
|
||||
d: function (c) { return 'dag' + (c === 1 ? 'ur' : 'ar') },
|
||||
h: function (c) { return 'klukkutím' + (c === 1 ? 'i' : 'ar') },
|
||||
m: function (c) { return 'mínút' + (c === 1 ? 'a' : 'ur') },
|
||||
s: function (c) { return 'sekúnd' + (c === 1 ? 'a' : 'ur') },
|
||||
ms: function (c) { return 'millisekúnd' + (c === 1 ? 'a' : 'ur') },
|
||||
decimal: '.'
|
||||
},
|
||||
it: {
|
||||
y: function (c) { return 'ann' + (c === 1 ? 'o' : 'i') },
|
||||
mo: function (c) { return 'mes' + (c === 1 ? 'e' : 'i') },
|
||||
w: function (c) { return 'settiman' + (c === 1 ? 'a' : 'e') },
|
||||
d: function (c) { return 'giorn' + (c === 1 ? 'o' : 'i') },
|
||||
h: function (c) { return 'or' + (c === 1 ? 'a' : 'e') },
|
||||
m: function (c) { return 'minut' + (c === 1 ? 'o' : 'i') },
|
||||
s: function (c) { return 'second' + (c === 1 ? 'o' : 'i') },
|
||||
ms: function (c) { return 'millisecond' + (c === 1 ? 'o' : 'i') },
|
||||
decimal: ','
|
||||
},
|
||||
ja: {
|
||||
y: '年',
|
||||
mo: '月',
|
||||
w: '週',
|
||||
d: '日',
|
||||
h: '時間',
|
||||
m: '分',
|
||||
s: '秒',
|
||||
ms: 'ミリ秒',
|
||||
decimal: '.'
|
||||
},
|
||||
ko: {
|
||||
y: '년',
|
||||
mo: '개월',
|
||||
w: '주일',
|
||||
d: '일',
|
||||
h: '시간',
|
||||
m: '분',
|
||||
s: '초',
|
||||
ms: '밀리 초',
|
||||
decimal: '.'
|
||||
},
|
||||
lo: {
|
||||
y: 'ປີ',
|
||||
mo: 'ເດືອນ',
|
||||
w: 'ອາທິດ',
|
||||
d: 'ມື້',
|
||||
h: 'ຊົ່ວໂມງ',
|
||||
m: 'ນາທີ',
|
||||
s: 'ວິນາທີ',
|
||||
ms: 'ມິນລິວິນາທີ',
|
||||
decimal: ','
|
||||
},
|
||||
lt: {
|
||||
y: function (c) { return ((c % 10 === 0) || (c % 100 >= 10 && c % 100 <= 20)) ? 'metų' : 'metai' },
|
||||
mo: function (c) { return ['mėnuo', 'mėnesiai', 'mėnesių'][getLithuanianForm(c)] },
|
||||
w: function (c) { return ['savaitė', 'savaitės', 'savaičių'][getLithuanianForm(c)] },
|
||||
d: function (c) { return ['diena', 'dienos', 'dienų'][getLithuanianForm(c)] },
|
||||
h: function (c) { return ['valanda', 'valandos', 'valandų'][getLithuanianForm(c)] },
|
||||
m: function (c) { return ['minutė', 'minutės', 'minučių'][getLithuanianForm(c)] },
|
||||
s: function (c) { return ['sekundė', 'sekundės', 'sekundžių'][getLithuanianForm(c)] },
|
||||
ms: function (c) { return ['milisekundė', 'milisekundės', 'milisekundžių'][getLithuanianForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
lv: {
|
||||
y: function (c) { return ['gads', 'gadi'][getLatvianForm(c)] },
|
||||
mo: function (c) { return ['mēnesis', 'mēneši'][getLatvianForm(c)] },
|
||||
w: function (c) { return ['nedēļa', 'nedēļas'][getLatvianForm(c)] },
|
||||
d: function (c) { return ['diena', 'dienas'][getLatvianForm(c)] },
|
||||
h: function (c) { return ['stunda', 'stundas'][getLatvianForm(c)] },
|
||||
m: function (c) { return ['minūte', 'minūtes'][getLatvianForm(c)] },
|
||||
s: function (c) { return ['sekunde', 'sekundes'][getLatvianForm(c)] },
|
||||
ms: function (c) { return ['milisekunde', 'milisekundes'][getLatvianForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
ms: {
|
||||
y: 'tahun',
|
||||
mo: 'bulan',
|
||||
w: 'minggu',
|
||||
d: 'hari',
|
||||
h: 'jam',
|
||||
m: 'minit',
|
||||
s: 'saat',
|
||||
ms: 'milisaat',
|
||||
decimal: '.'
|
||||
},
|
||||
nl: {
|
||||
y: 'jaar',
|
||||
mo: function (c) { return c === 1 ? 'maand' : 'maanden' },
|
||||
w: function (c) { return c === 1 ? 'week' : 'weken' },
|
||||
d: function (c) { return c === 1 ? 'dag' : 'dagen' },
|
||||
h: 'uur',
|
||||
m: function (c) { return c === 1 ? 'minuut' : 'minuten' },
|
||||
s: function (c) { return c === 1 ? 'seconde' : 'seconden' },
|
||||
ms: function (c) { return c === 1 ? 'milliseconde' : 'milliseconden' },
|
||||
decimal: ','
|
||||
},
|
||||
no: {
|
||||
y: 'år',
|
||||
mo: function (c) { return 'måned' + (c === 1 ? '' : 'er') },
|
||||
w: function (c) { return 'uke' + (c === 1 ? '' : 'r') },
|
||||
d: function (c) { return 'dag' + (c === 1 ? '' : 'er') },
|
||||
h: function (c) { return 'time' + (c === 1 ? '' : 'r') },
|
||||
m: function (c) { return 'minutt' + (c === 1 ? '' : 'er') },
|
||||
s: function (c) { return 'sekund' + (c === 1 ? '' : 'er') },
|
||||
ms: function (c) { return 'millisekund' + (c === 1 ? '' : 'er') },
|
||||
decimal: ','
|
||||
},
|
||||
pl: {
|
||||
y: function (c) { return ['rok', 'roku', 'lata', 'lat'][getPolishForm(c)] },
|
||||
mo: function (c) { return ['miesiąc', 'miesiąca', 'miesiące', 'miesięcy'][getPolishForm(c)] },
|
||||
w: function (c) { return ['tydzień', 'tygodnia', 'tygodnie', 'tygodni'][getPolishForm(c)] },
|
||||
d: function (c) { return ['dzień', 'dnia', 'dni', 'dni'][getPolishForm(c)] },
|
||||
h: function (c) { return ['godzina', 'godziny', 'godziny', 'godzin'][getPolishForm(c)] },
|
||||
m: function (c) { return ['minuta', 'minuty', 'minuty', 'minut'][getPolishForm(c)] },
|
||||
s: function (c) { return ['sekunda', 'sekundy', 'sekundy', 'sekund'][getPolishForm(c)] },
|
||||
ms: function (c) { return ['milisekunda', 'milisekundy', 'milisekundy', 'milisekund'][getPolishForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
pt: {
|
||||
y: function (c) { return 'ano' + (c === 1 ? '' : 's') },
|
||||
mo: function (c) { return c === 1 ? 'mês' : 'meses' },
|
||||
w: function (c) { return 'semana' + (c === 1 ? '' : 's') },
|
||||
d: function (c) { return 'dia' + (c === 1 ? '' : 's') },
|
||||
h: function (c) { return 'hora' + (c === 1 ? '' : 's') },
|
||||
m: function (c) { return 'minuto' + (c === 1 ? '' : 's') },
|
||||
s: function (c) { return 'segundo' + (c === 1 ? '' : 's') },
|
||||
ms: function (c) { return 'milissegundo' + (c === 1 ? '' : 's') },
|
||||
decimal: ','
|
||||
},
|
||||
ro: {
|
||||
y: function (c) { return c === 1 ? 'an' : 'ani' },
|
||||
mo: function (c) { return c === 1 ? 'lună' : 'luni' },
|
||||
w: function (c) { return c === 1 ? 'săptămână' : 'săptămâni' },
|
||||
d: function (c) { return c === 1 ? 'zi' : 'zile' },
|
||||
h: function (c) { return c === 1 ? 'oră' : 'ore' },
|
||||
m: function (c) { return c === 1 ? 'minut' : 'minute' },
|
||||
s: function (c) { return c === 1 ? 'secundă' : 'secunde' },
|
||||
ms: function (c) { return c === 1 ? 'milisecundă' : 'milisecunde' },
|
||||
decimal: ','
|
||||
},
|
||||
ru: {
|
||||
y: function (c) { return ['лет', 'год', 'года'][getSlavicForm(c)] },
|
||||
mo: function (c) { return ['месяцев', 'месяц', 'месяца'][getSlavicForm(c)] },
|
||||
w: function (c) { return ['недель', 'неделя', 'недели'][getSlavicForm(c)] },
|
||||
d: function (c) { return ['дней', 'день', 'дня'][getSlavicForm(c)] },
|
||||
h: function (c) { return ['часов', 'час', 'часа'][getSlavicForm(c)] },
|
||||
m: function (c) { return ['минут', 'минута', 'минуты'][getSlavicForm(c)] },
|
||||
s: function (c) { return ['секунд', 'секунда', 'секунды'][getSlavicForm(c)] },
|
||||
ms: function (c) { return ['миллисекунд', 'миллисекунда', 'миллисекунды'][getSlavicForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
uk: {
|
||||
y: function (c) { return ['років', 'рік', 'роки'][getSlavicForm(c)] },
|
||||
mo: function (c) { return ['місяців', 'місяць', 'місяці'][getSlavicForm(c)] },
|
||||
w: function (c) { return ['тижнів', 'тиждень', 'тижні'][getSlavicForm(c)] },
|
||||
d: function (c) { return ['днів', 'день', 'дні'][getSlavicForm(c)] },
|
||||
h: function (c) { return ['годин', 'година', 'години'][getSlavicForm(c)] },
|
||||
m: function (c) { return ['хвилин', 'хвилина', 'хвилини'][getSlavicForm(c)] },
|
||||
s: function (c) { return ['секунд', 'секунда', 'секунди'][getSlavicForm(c)] },
|
||||
ms: function (c) { return ['мілісекунд', 'мілісекунда', 'мілісекунди'][getSlavicForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
ur: {
|
||||
y: 'سال',
|
||||
mo: function (c) { return c === 1 ? 'مہینہ' : 'مہینے' },
|
||||
w: function (c) { return c === 1 ? 'ہفتہ' : 'ہفتے' },
|
||||
d: 'دن',
|
||||
h: function (c) { return c === 1 ? 'گھنٹہ' : 'گھنٹے' },
|
||||
m: 'منٹ',
|
||||
s: 'سیکنڈ',
|
||||
ms: 'ملی سیکنڈ',
|
||||
decimal: '.'
|
||||
},
|
||||
sk: {
|
||||
y: function (c) { return ['rok', 'roky', 'roky', 'rokov'][getCzechOrSlovakForm(c)] },
|
||||
mo: function (c) { return ['mesiac', 'mesiace', 'mesiace', 'mesiacov'][getCzechOrSlovakForm(c)] },
|
||||
w: function (c) { return ['týždeň', 'týždne', 'týždne', 'týždňov'][getCzechOrSlovakForm(c)] },
|
||||
d: function (c) { return ['deň', 'dni', 'dni', 'dní'][getCzechOrSlovakForm(c)] },
|
||||
h: function (c) { return ['hodina', 'hodiny', 'hodiny', 'hodín'][getCzechOrSlovakForm(c)] },
|
||||
m: function (c) { return ['minúta', 'minúty', 'minúty', 'minút'][getCzechOrSlovakForm(c)] },
|
||||
s: function (c) { return ['sekunda', 'sekundy', 'sekundy', 'sekúnd'][getCzechOrSlovakForm(c)] },
|
||||
ms: function (c) { return ['milisekunda', 'milisekundy', 'milisekundy', 'milisekúnd'][getCzechOrSlovakForm(c)] },
|
||||
decimal: ','
|
||||
},
|
||||
sv: {
|
||||
y: 'år',
|
||||
mo: function (c) { return 'månad' + (c === 1 ? '' : 'er') },
|
||||
w: function (c) { return 'veck' + (c === 1 ? 'a' : 'or') },
|
||||
d: function (c) { return 'dag' + (c === 1 ? '' : 'ar') },
|
||||
h: function (c) { return 'timm' + (c === 1 ? 'e' : 'ar') },
|
||||
m: function (c) { return 'minut' + (c === 1 ? '' : 'er') },
|
||||
s: function (c) { return 'sekund' + (c === 1 ? '' : 'er') },
|
||||
ms: function (c) { return 'millisekund' + (c === 1 ? '' : 'er') },
|
||||
decimal: ','
|
||||
},
|
||||
sw: {
|
||||
y: function (c) { return c === 1 ? 'mwaka' : 'miaka' },
|
||||
mo: function (c) { return c === 1 ? 'mwezi' : 'miezi' },
|
||||
w: 'wiki',
|
||||
d: function (c) { return c === 1 ? 'siku' : 'masiku' },
|
||||
h: function (c) { return c === 1 ? 'saa' : 'masaa' },
|
||||
m: 'dakika',
|
||||
s: 'sekunde',
|
||||
ms: 'milisekunde',
|
||||
decimal: '.'
|
||||
},
|
||||
tr: {
|
||||
y: 'yıl',
|
||||
mo: 'ay',
|
||||
w: 'hafta',
|
||||
d: 'gün',
|
||||
h: 'saat',
|
||||
m: 'dakika',
|
||||
s: 'saniye',
|
||||
ms: 'milisaniye',
|
||||
decimal: ','
|
||||
},
|
||||
th: {
|
||||
y: 'ปี',
|
||||
mo: 'เดือน',
|
||||
w: 'อาทิตย์',
|
||||
d: 'วัน',
|
||||
h: 'ชั่วโมง',
|
||||
m: 'นาที',
|
||||
s: 'วินาที',
|
||||
ms: 'มิลลิวินาที',
|
||||
decimal: '.'
|
||||
},
|
||||
vi: {
|
||||
y: 'năm',
|
||||
mo: 'tháng',
|
||||
w: 'tuần',
|
||||
d: 'ngày',
|
||||
h: 'giờ',
|
||||
m: 'phút',
|
||||
s: 'giây',
|
||||
ms: 'mili giây',
|
||||
decimal: ','
|
||||
},
|
||||
zh_CN: {
|
||||
y: '年',
|
||||
mo: '个月',
|
||||
w: '周',
|
||||
d: '天',
|
||||
h: '小时',
|
||||
m: '分钟',
|
||||
s: '秒',
|
||||
ms: '毫秒',
|
||||
decimal: '.'
|
||||
},
|
||||
zh_TW: {
|
||||
y: '年',
|
||||
mo: '個月',
|
||||
w: '周',
|
||||
d: '天',
|
||||
h: '小時',
|
||||
m: '分鐘',
|
||||
s: '秒',
|
||||
ms: '毫秒',
|
||||
decimal: '.'
|
||||
}
|
||||
}
|
||||
|
||||
// You can create a humanizer, which returns a function with default
|
||||
// parameters.
|
||||
function humanizer (passedOptions) {
|
||||
var result = function humanizer (ms, humanizerOptions) {
|
||||
var options = extend({}, result, humanizerOptions || {})
|
||||
return doHumanization(ms, options)
|
||||
}
|
||||
|
||||
return extend(result, {
|
||||
language: 'en',
|
||||
delimiter: ', ',
|
||||
spacer: ' ',
|
||||
conjunction: '',
|
||||
serialComma: true,
|
||||
units: ['y', 'mo', 'w', 'd', 'h', 'm', 's'],
|
||||
languages: {},
|
||||
round: false,
|
||||
unitMeasures: {
|
||||
y: 31557600000,
|
||||
mo: 2629800000,
|
||||
w: 604800000,
|
||||
d: 86400000,
|
||||
h: 3600000,
|
||||
m: 60000,
|
||||
s: 1000,
|
||||
ms: 1
|
||||
}
|
||||
}, passedOptions)
|
||||
}
|
||||
|
||||
// The main function is just a wrapper around a default humanizer.
|
||||
var humanizeDuration = humanizer({})
|
||||
|
||||
// Build dictionary from options
|
||||
function getDictionary (options) {
|
||||
var languagesFromOptions = [options.language]
|
||||
|
||||
if (has(options, 'fallbacks')) {
|
||||
if (isArray(options.fallbacks) && options.fallbacks.length) {
|
||||
languagesFromOptions = languagesFromOptions.concat(options.fallbacks)
|
||||
} else {
|
||||
throw new Error('fallbacks must be an array with at least one element')
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < languagesFromOptions.length; i++) {
|
||||
var languageToTry = languagesFromOptions[i]
|
||||
if (has(options.languages, languageToTry)) {
|
||||
return options.languages[languageToTry]
|
||||
} else if (has(languages, languageToTry)) {
|
||||
return languages[languageToTry]
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('No language found.')
|
||||
}
|
||||
|
||||
// doHumanization does the bulk of the work.
|
||||
function doHumanization (ms, options) {
|
||||
var i, len, piece
|
||||
|
||||
// Make sure we have a positive number.
|
||||
// Has the nice sideffect of turning Number objects into primitives.
|
||||
ms = Math.abs(ms)
|
||||
|
||||
var dictionary = getDictionary(options)
|
||||
var pieces = []
|
||||
|
||||
// Start at the top and keep removing units, bit by bit.
|
||||
var unitName, unitMS, unitCount
|
||||
for (i = 0, len = options.units.length; i < len; i++) {
|
||||
unitName = options.units[i]
|
||||
unitMS = options.unitMeasures[unitName]
|
||||
|
||||
// What's the number of full units we can fit?
|
||||
if (i + 1 === len) {
|
||||
if (has(options, 'maxDecimalPoints')) {
|
||||
// We need to use this expValue to avoid rounding functionality of toFixed call
|
||||
var expValue = Math.pow(10, options.maxDecimalPoints)
|
||||
var unitCountFloat = (ms / unitMS)
|
||||
unitCount = parseFloat((Math.floor(expValue * unitCountFloat) / expValue).toFixed(options.maxDecimalPoints))
|
||||
} else {
|
||||
unitCount = ms / unitMS
|
||||
}
|
||||
} else {
|
||||
unitCount = Math.floor(ms / unitMS)
|
||||
}
|
||||
|
||||
// Add the string.
|
||||
pieces.push({
|
||||
unitCount: unitCount,
|
||||
unitName: unitName
|
||||
})
|
||||
|
||||
// Remove what we just figured out.
|
||||
ms -= unitCount * unitMS
|
||||
}
|
||||
|
||||
var firstOccupiedUnitIndex = 0
|
||||
for (i = 0; i < pieces.length; i++) {
|
||||
if (pieces[i].unitCount) {
|
||||
firstOccupiedUnitIndex = i
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (options.round) {
|
||||
var ratioToLargerUnit, previousPiece
|
||||
for (i = pieces.length - 1; i >= 0; i--) {
|
||||
piece = pieces[i]
|
||||
piece.unitCount = Math.round(piece.unitCount)
|
||||
|
||||
if (i === 0) { break }
|
||||
|
||||
previousPiece = pieces[i - 1]
|
||||
|
||||
ratioToLargerUnit = options.unitMeasures[previousPiece.unitName] / options.unitMeasures[piece.unitName]
|
||||
if ((piece.unitCount % ratioToLargerUnit) === 0 || (options.largest && ((options.largest - 1) < (i - firstOccupiedUnitIndex)))) {
|
||||
previousPiece.unitCount += piece.unitCount / ratioToLargerUnit
|
||||
piece.unitCount = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var result = []
|
||||
for (i = 0, pieces.length; i < len; i++) {
|
||||
piece = pieces[i]
|
||||
if (piece.unitCount) {
|
||||
result.push(render(piece.unitCount, piece.unitName, dictionary, options))
|
||||
}
|
||||
|
||||
if (result.length === options.largest) { break }
|
||||
}
|
||||
|
||||
if (result.length) {
|
||||
if (!options.conjunction || result.length === 1) {
|
||||
return result.join(options.delimiter)
|
||||
} else if (result.length === 2) {
|
||||
return result.join(options.conjunction)
|
||||
} else if (result.length > 2) {
|
||||
return result.slice(0, -1).join(options.delimiter) + (options.serialComma ? ',' : '') + options.conjunction + result.slice(-1)
|
||||
}
|
||||
} else {
|
||||
return render(0, options.units[options.units.length - 1], dictionary, options)
|
||||
}
|
||||
}
|
||||
|
||||
function render (count, type, dictionary, options) {
|
||||
var decimal
|
||||
if (has(options, 'decimal')) {
|
||||
decimal = options.decimal
|
||||
} else if (has(dictionary, 'decimal')) {
|
||||
decimal = dictionary.decimal
|
||||
} else {
|
||||
decimal = '.'
|
||||
}
|
||||
|
||||
var countStr = count.toString().replace('.', decimal)
|
||||
|
||||
var dictionaryValue = dictionary[type]
|
||||
var word
|
||||
if (typeof dictionaryValue === 'function') {
|
||||
word = dictionaryValue(count)
|
||||
} else {
|
||||
word = dictionaryValue
|
||||
}
|
||||
|
||||
return countStr + options.spacer + word
|
||||
}
|
||||
|
||||
function extend (destination) {
|
||||
var source
|
||||
for (var i = 1; i < arguments.length; i++) {
|
||||
source = arguments[i]
|
||||
for (var prop in source) {
|
||||
if (has(source, prop)) {
|
||||
destination[prop] = source[prop]
|
||||
}
|
||||
}
|
||||
}
|
||||
return destination
|
||||
}
|
||||
|
||||
// Internal helper function for Polish language.
|
||||
function getPolishForm (c) {
|
||||
if (c === 1) {
|
||||
return 0
|
||||
} else if (Math.floor(c) !== c) {
|
||||
return 1
|
||||
} else if (c % 10 >= 2 && c % 10 <= 4 && !(c % 100 > 10 && c % 100 < 20)) {
|
||||
return 2
|
||||
} else {
|
||||
return 3
|
||||
}
|
||||
}
|
||||
|
||||
// Internal helper function for Russian and Ukranian languages.
|
||||
function getSlavicForm (c) {
|
||||
if (Math.floor(c) !== c) {
|
||||
return 2
|
||||
} else if ((c % 100 >= 5 && c % 100 <= 20) || (c % 10 >= 5 && c % 10 <= 9) || c % 10 === 0) {
|
||||
return 0
|
||||
} else if (c % 10 === 1) {
|
||||
return 1
|
||||
} else if (c > 1) {
|
||||
return 2
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
// Internal helper function for Slovak language.
|
||||
function getCzechOrSlovakForm (c) {
|
||||
if (c === 1) {
|
||||
return 0
|
||||
} else if (Math.floor(c) !== c) {
|
||||
return 1
|
||||
} else if (c % 10 >= 2 && c % 10 <= 4 && c % 100 < 10) {
|
||||
return 2
|
||||
} else {
|
||||
return 3
|
||||
}
|
||||
}
|
||||
|
||||
// Internal helper function for Lithuanian language.
|
||||
function getLithuanianForm (c) {
|
||||
if (c === 1 || (c % 10 === 1 && c % 100 > 20)) {
|
||||
return 0
|
||||
} else if (Math.floor(c) !== c || (c % 10 >= 2 && c % 100 > 20) || (c % 10 >= 2 && c % 100 < 10)) {
|
||||
return 1
|
||||
} else {
|
||||
return 2
|
||||
}
|
||||
}
|
||||
|
||||
// Internal helper function for Latvian language.
|
||||
function getLatvianForm (c) {
|
||||
if (c === 1 || (c % 10 === 1 && c % 100 !== 11)) {
|
||||
return 0
|
||||
} else {
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
// Internal helper function for Arabic language.
|
||||
function getArabicForm (c) {
|
||||
if (c <= 2) { return 0 }
|
||||
if (c > 2 && c < 11) { return 1 }
|
||||
return 0
|
||||
}
|
||||
|
||||
// We need to make sure we support browsers that don't have
|
||||
// `Array.isArray`, so we define a fallback here.
|
||||
var isArray = Array.isArray || function (arg) {
|
||||
return Object.prototype.toString.call(arg) === '[object Array]'
|
||||
}
|
||||
|
||||
function has (obj, key) {
|
||||
return Object.prototype.hasOwnProperty.call(obj, key)
|
||||
}
|
||||
|
||||
humanizeDuration.getSupportedLanguages = function getSupportedLanguages () {
|
||||
var result = []
|
||||
for (var language in languages) {
|
||||
if (has(languages, language) && language !== 'gr') {
|
||||
result.push(language)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
humanizeDuration.humanizer = humanizer
|
||||
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(function () {
|
||||
return humanizeDuration
|
||||
})
|
||||
} else if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = humanizeDuration
|
||||
} else {
|
||||
this.humanizeDuration = humanizeDuration
|
||||
}
|
||||
})(); // eslint-disable-line semi
|
File diff suppressed because one or more lines are too long
@ -25,11 +25,6 @@
|
||||
<meta content="#cc0000" name="msapplication-TileColor">
|
||||
<meta content="https://www.rug.nl/mstile-144x144.png" name="msapplication-TileImage">
|
||||
<meta content="user-scalable=1, initial-scale=1.0" name="viewport">
|
||||
{% comment %}
|
||||
<script type="text/javascript">
|
||||
var alertsHref = "";
|
||||
</script>
|
||||
{% endcomment %}
|
||||
|
||||
<script src="https://www.rug.nl/_definition/shared/js/jquery.js?version=2019-12-12" type="text/javascript"></script>
|
||||
<script type="text/javascript">jQuery.noConflict();</script>
|
||||
@ -51,6 +46,9 @@
|
||||
<script type="text/javascript" src="https://www.rug.nl/_definition/shared/js/cross-frame.js?version=2019-12-12"></script>
|
||||
|
||||
<link href="{% static 'RUG_template/css/base.css' %}" rel="stylesheet"/>
|
||||
<script type="text/javascript" src="{% static 'RUG_template/javascript/moment-with-locales.min.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'RUG_template/javascript/humanize-duration.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'RUG_template/javascript/formdata.min.js' %}"></script>
|
||||
|
||||
</head>
|
||||
<body itemtype="http://schema.org/WebPage" itemscope="itemscope" id="top" class="page--topicpage"><!--googleoff: all-->
|
||||
@ -90,6 +88,10 @@
|
||||
{% get_current_language as LANGUAGE_CODE %}
|
||||
{% get_available_languages as LANGUAGES %}
|
||||
{% get_language_info_list for LANGUAGES as languages %}
|
||||
{% comment %} Here we set the MomentJS locale for all date and time actions {% endcomment %}
|
||||
<script type="text/javascript">
|
||||
moment.locale('{{LANGUAGE_CODE}}');
|
||||
</script>
|
||||
<input name="next" type="hidden" value="{% if redirect_to %}{{ redirect_to }}{% endif %}">
|
||||
<input type="hidden" name="language" id="language" value="{{LANGUAGE_CODE}}">
|
||||
{% for language in languages %}
|
||||
|
@ -5,7 +5,7 @@ Please go to the following page and choose a new password:
|
||||
|
||||
{{ protocol}}://{{ domain }}{{ reset_url }}
|
||||
|
||||
Your username, in case you’ve forgotten: {{ user }}
|
||||
Your username, in case you've forgotten: {{ user }}
|
||||
|
||||
Thanks for using our site!
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from .models import Employee
|
||||
|
||||
@ -9,7 +10,7 @@ from .models import Employee
|
||||
class EmployeeInline(admin.StackedInline):
|
||||
model = Employee
|
||||
can_delete = False
|
||||
verbose_name_plural = 'employee'
|
||||
verbose_name_plural = _('employee')
|
||||
|
||||
# Define a new User admin
|
||||
class UserAdmin(BaseUserAdmin):
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -18,6 +18,10 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps/employee/admin.py:13 apps/employee/models.py:28
|
||||
msgid "employee"
|
||||
msgstr ""
|
||||
|
||||
#: apps/employee/apps.py:7
|
||||
msgid "Employee"
|
||||
msgstr ""
|
||||
@ -26,10 +30,6 @@ msgstr ""
|
||||
msgid "Employees"
|
||||
msgstr ""
|
||||
|
||||
#: apps/employee/models.py:28
|
||||
msgid "employee"
|
||||
msgstr ""
|
||||
|
||||
#: apps/employee/models.py:29
|
||||
msgid "employees"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-05-15 12:46+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
@ -18,6 +18,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: apps/employee/admin.py:13 apps/employee/models.py:28
|
||||
msgid "employee"
|
||||
msgstr "medewerker"
|
||||
|
||||
#: apps/employee/apps.py:7
|
||||
msgid "Employee"
|
||||
msgstr "Medewerker"
|
||||
@ -26,10 +30,6 @@ msgstr "Medewerker"
|
||||
msgid "Employees"
|
||||
msgstr "Medewerkers"
|
||||
|
||||
#: apps/employee/models.py:28
|
||||
msgid "employee"
|
||||
msgstr "medewerker"
|
||||
|
||||
#: apps/employee/models.py:29
|
||||
msgid "employees"
|
||||
msgstr "medewerkers"
|
||||
|
@ -0,0 +1,26 @@
|
||||
# Generated by Django 3.0.6 on 2020-05-19 13:51
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('hospital', '0003_auto_20200518_1227'),
|
||||
('polyclinic', '0003_auto_20200518_1227'),
|
||||
('employee', '0003_auto_20200518_1227'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='employee',
|
||||
name='hospital',
|
||||
field=models.ForeignKey(help_text='Select the hospital for this employee', on_delete=django.db.models.deletion.CASCADE, to='hospital.Hospital', verbose_name='hospital'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='employee',
|
||||
name='polyclinic',
|
||||
field=models.ManyToManyField(blank=True, help_text='Select the polyclinic(s) for this employee', to='polyclinic.Polyclinic', verbose_name='polyclinic'),
|
||||
),
|
||||
]
|
@ -14,8 +14,8 @@ class Employee(MetaDataModel):
|
||||
|
||||
Attributes
|
||||
----------
|
||||
user : User
|
||||
The Django user in the system where this employee data belongs to.
|
||||
user : :class:`~django.contrib.auth.models.User`
|
||||
The Django User model that is the employee.
|
||||
hospital : Hospital
|
||||
The hospital where this employee is working. You can only choose **one** hospital per employee.
|
||||
polyclinic : Polyclinic
|
||||
@ -30,11 +30,11 @@ class Employee(MetaDataModel):
|
||||
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE, help_text=_('Django user'))
|
||||
|
||||
hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE, help_text=_('Select the hospital for this employee'))
|
||||
hospital = models.ForeignKey(Hospital, verbose_name=Hospital._meta.verbose_name, on_delete=models.CASCADE, help_text=_('Select the hospital for this employee'))
|
||||
|
||||
polyclinic = models.ManyToManyField(Polyclinic, blank=True, help_text=_('Select the polyclinic(s) for this employee'))
|
||||
polyclinic = models.ManyToManyField(Polyclinic, verbose_name=Polyclinic._meta.verbose_name, blank=True, help_text=_('Select the polyclinic(s) for this employee'))
|
||||
phone = models.CharField(_('Phone number'), max_length=20, blank=True, help_text=_('The direct phone number of this employee'))
|
||||
|
||||
def __str__(self):
|
||||
"""str: Returns a readable name for the employee. Format is [employee_full_name] ([city])."""
|
||||
return '{} ({})'.format(self.user.get_full_name(), self.hospital)
|
||||
return '{} ({})'.format(self.user.get_full_name(), self.hospital)
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-05-15 12:43+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-05-15 12:47+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
|
@ -0,0 +1,20 @@
|
||||
# Generated by Django 3.0.6 on 2020-05-19 13:51
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('hospital', '0003_auto_20200518_1227'),
|
||||
('polyclinic', '0003_auto_20200518_1227'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='polyclinic',
|
||||
name='hospital',
|
||||
field=models.ForeignKey(help_text='To which hospital belongs this polyclinic', on_delete=django.db.models.deletion.CASCADE, to='hospital.Hospital', verbose_name='hospital'),
|
||||
),
|
||||
]
|
@ -24,7 +24,7 @@ class Polyclinic(MetaDataModel):
|
||||
verbose_name = _('polyclinic')
|
||||
verbose_name_plural = _('polyclinics')
|
||||
|
||||
hospital = models.ForeignKey(Hospital, on_delete=models.CASCADE, help_text=_('To which hospital belongs this polyclinic'))
|
||||
hospital = models.ForeignKey(Hospital, verbose_name=Hospital._meta.verbose_name, on_delete=models.CASCADE, help_text=_('To which hospital belongs this polyclinic'))
|
||||
name = models.CharField(_('Name'), max_length=200, blank=True, help_text=_('The name of this polyclinic'))
|
||||
phone = models.CharField(_('Phone number'), max_length=20, blank=True, help_text=_('The general/direct phone number of this polyclinic'))
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
from django.contrib import admin
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from .models import Schedule
|
||||
|
||||
@ -14,3 +15,4 @@ class ScheduleAdmin(admin.ModelAdmin):
|
||||
return obj.done
|
||||
|
||||
done.boolean = True
|
||||
done.short_description = _('Done')
|
||||
|
@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from .models import Schedule
|
||||
|
||||
class ScheduleForm(forms.Form):
|
||||
name = forms.CharField(label=_('Department name'), help_text=_('Enter a descriptive name for this schedule'), max_length=100)
|
||||
email = forms.CharField(label=_('Email address for results'), help_text=_('When the job is done, the results will be sent to this email address'), max_length=100)
|
||||
json = forms.CharField(label=_('Email address for results'), help_text=_('When the job is done, the results will be sent to this email address'), widget=forms.HiddenInput(), strip=True)
|
||||
name = forms.CharField(label=_('Department name'), help_text=_('Enter a descriptive name for this schedule'), max_length=100)
|
||||
email = forms.CharField(label=_('Email address for results'), help_text=_('When the job is done, the results will be sent to this email address'), max_length=100)
|
||||
json = forms.CharField(label=_('JSON form data'), help_text=_('The RAW JSON data of the saved form'), widget=forms.HiddenInput(), strip=True)
|
||||
status = forms.CharField(label=_('Status'), help_text=_('The status of this schedule.'), max_length=10, widget=forms.HiddenInput() )
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -18,6 +18,10 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: apps/schedule/admin.py:18 apps/schedule/models.py:75
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/apps.py:7
|
||||
msgid "Schedule"
|
||||
msgstr ""
|
||||
@ -34,116 +38,125 @@ msgstr ""
|
||||
msgid "Enter a descriptive name for this schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/forms.py:8 apps/schedule/forms.py:9
|
||||
#: apps/schedule/forms.py:8
|
||||
msgid "Email address for results"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/forms.py:8 apps/schedule/forms.py:9
|
||||
#: apps/schedule/forms.py:8
|
||||
msgid "When the job is done, the results will be sent to this email address"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:27
|
||||
msgid "schedule"
|
||||
#: apps/schedule/forms.py:9
|
||||
msgid "JSON form data"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:28
|
||||
msgid "schedules"
|
||||
#: apps/schedule/forms.py:9
|
||||
msgid "The RAW JSON data of the saved form"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/forms.py:10 apps/schedule/models.py:84
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:16
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/forms.py:10 apps/schedule/models.py:84
|
||||
msgid "The status of this schedule."
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:31
|
||||
msgid "New"
|
||||
msgid "schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:32
|
||||
msgid "schedules"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:70
|
||||
msgid "Draft"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:71
|
||||
msgid "New"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:72
|
||||
msgid "Accepted"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:33
|
||||
#: apps/schedule/models.py:73
|
||||
msgid "Processing"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:34
|
||||
#: apps/schedule/models.py:74
|
||||
msgid "Processed"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:35
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:36
|
||||
#: apps/schedule/models.py:76
|
||||
msgid "Invalid"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:37
|
||||
#: apps/schedule/models.py:77
|
||||
msgid "Failure"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:39
|
||||
#: apps/schedule/models.py:79
|
||||
msgid "Select the employee that is responsible for this schedule request"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:41
|
||||
#: apps/schedule/models.py:81
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:13
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:41
|
||||
#: apps/schedule/models.py:81
|
||||
msgid "Name of the schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:42
|
||||
#: apps/schedule/models.py:82
|
||||
msgid "Email address"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:42
|
||||
#: apps/schedule/models.py:82
|
||||
msgid "Email address where the results will be sent to."
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:44
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:44
|
||||
msgid "The status of this schedule."
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:46
|
||||
#: apps/schedule/models.py:86
|
||||
msgid "Schedule input"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:46
|
||||
#: apps/schedule/models.py:86
|
||||
msgid "The schedule input in JSON format based on the form data"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:51
|
||||
#: apps/schedule/models.py:88
|
||||
msgid "Peregrine JSON output"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:51
|
||||
#: apps/schedule/models.py:88
|
||||
msgid "The results from the Peregrine job in JSON"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:53
|
||||
#: apps/schedule/models.py:90
|
||||
msgid "Peregrine binary output"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:53
|
||||
#: apps/schedule/models.py:90
|
||||
msgid "This is the output in binary format from the Peregrine cluster"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:55
|
||||
#: apps/schedule/models.py:92
|
||||
msgid "Report is send to user"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:55
|
||||
#: apps/schedule/models.py:92
|
||||
msgid "The date and time when the report has sended to the user."
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:57
|
||||
#: apps/schedule/models.py:94
|
||||
msgid "Peregrine logging"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/models.py:57
|
||||
#: apps/schedule/models.py:94
|
||||
msgid "Here you can see the logging of the Peregrine job."
|
||||
msgstr ""
|
||||
|
||||
@ -161,19 +174,49 @@ msgstr ""
|
||||
msgid "Updated"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:16
|
||||
msgid "Running"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:17
|
||||
msgid "Report"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:18
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:33
|
||||
msgid "Resume"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:35
|
||||
msgid "Clone"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:41
|
||||
msgid "No schedules available"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:5
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:6
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:7
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:16
|
||||
msgid "Resume schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:9
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:18
|
||||
msgid "Clone schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:11
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:20
|
||||
msgid "New schedule"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:432
|
||||
msgid "Save as draft"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:434
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:821
|
||||
msgid "and"
|
||||
msgstr ""
|
||||
|
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"PO-Revision-Date: 2020-05-18 16:39+0200\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-06-08 13:44+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: nl\n"
|
||||
@ -18,6 +18,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: apps/schedule/admin.py:18 apps/schedule/models.py:75
|
||||
msgid "Done"
|
||||
msgstr "Klaar"
|
||||
|
||||
#: apps/schedule/apps.py:7
|
||||
msgid "Schedule"
|
||||
msgstr "Rooster"
|
||||
@ -34,116 +38,125 @@ msgstr "Afdelingsnaam"
|
||||
msgid "Enter a descriptive name for this schedule"
|
||||
msgstr "Voer een beschrijvende naam in voor dit schema"
|
||||
|
||||
#: apps/schedule/forms.py:8 apps/schedule/forms.py:9
|
||||
#: apps/schedule/forms.py:8
|
||||
msgid "Email address for results"
|
||||
msgstr "E-mailadres voor resultaten"
|
||||
|
||||
#: apps/schedule/forms.py:8 apps/schedule/forms.py:9
|
||||
#: apps/schedule/forms.py:8
|
||||
msgid "When the job is done, the results will be sent to this email address"
|
||||
msgstr "Als de klus geklaard is, worden de resultaten naar dit e-mailadres gestuurd"
|
||||
|
||||
#: apps/schedule/models.py:27
|
||||
#: apps/schedule/forms.py:9
|
||||
msgid "JSON form data"
|
||||
msgstr "JSON formulier data"
|
||||
|
||||
#: apps/schedule/forms.py:9
|
||||
msgid "The RAW JSON data of the saved form"
|
||||
msgstr "De rauwe JSON data van het opgeslagen formulier"
|
||||
|
||||
#: apps/schedule/forms.py:10 apps/schedule/models.py:84
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:16
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: apps/schedule/forms.py:10 apps/schedule/models.py:84
|
||||
msgid "The status of this schedule."
|
||||
msgstr "De status van dit rooster."
|
||||
|
||||
#: apps/schedule/models.py:31
|
||||
msgid "schedule"
|
||||
msgstr "rooster"
|
||||
|
||||
#: apps/schedule/models.py:28
|
||||
#: apps/schedule/models.py:32
|
||||
msgid "schedules"
|
||||
msgstr "roosters"
|
||||
|
||||
#: apps/schedule/models.py:31
|
||||
#: apps/schedule/models.py:70
|
||||
msgid "Draft"
|
||||
msgstr "Concept"
|
||||
|
||||
#: apps/schedule/models.py:71
|
||||
msgid "New"
|
||||
msgstr "Nieuw"
|
||||
|
||||
#: apps/schedule/models.py:32
|
||||
#: apps/schedule/models.py:72
|
||||
msgid "Accepted"
|
||||
msgstr "Geaccepteerd"
|
||||
|
||||
#: apps/schedule/models.py:33
|
||||
#: apps/schedule/models.py:73
|
||||
msgid "Processing"
|
||||
msgstr "Verwerken"
|
||||
|
||||
#: apps/schedule/models.py:34
|
||||
#: apps/schedule/models.py:74
|
||||
msgid "Processed"
|
||||
msgstr "Verwerkt"
|
||||
|
||||
#: apps/schedule/models.py:35
|
||||
msgid "Done"
|
||||
msgstr "Klaar"
|
||||
|
||||
#: apps/schedule/models.py:36
|
||||
#: apps/schedule/models.py:76
|
||||
msgid "Invalid"
|
||||
msgstr "Ongeldig"
|
||||
|
||||
#: apps/schedule/models.py:37
|
||||
#: apps/schedule/models.py:77
|
||||
msgid "Failure"
|
||||
msgstr "Error"
|
||||
|
||||
#: apps/schedule/models.py:39
|
||||
#: apps/schedule/models.py:79
|
||||
msgid "Select the employee that is responsible for this schedule request"
|
||||
msgstr "Selecteer de medewerker die verantwoordelijk is voor dit roosterverzoek"
|
||||
|
||||
#: apps/schedule/models.py:41
|
||||
#: apps/schedule/models.py:81
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:13
|
||||
msgid "Name"
|
||||
msgstr "Naam"
|
||||
|
||||
#: apps/schedule/models.py:41
|
||||
#: apps/schedule/models.py:81
|
||||
msgid "Name of the schedule"
|
||||
msgstr "Naam van de rooster"
|
||||
|
||||
#: apps/schedule/models.py:42
|
||||
#: apps/schedule/models.py:82
|
||||
msgid "Email address"
|
||||
msgstr "E-mailadres"
|
||||
|
||||
#: apps/schedule/models.py:42
|
||||
#: apps/schedule/models.py:82
|
||||
msgid "Email address where the results will be sent to."
|
||||
msgstr "E-mailadres waar de resultaten naartoe worden gestuurd."
|
||||
|
||||
#: apps/schedule/models.py:44
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: apps/schedule/models.py:44
|
||||
msgid "The status of this schedule."
|
||||
msgstr "De status van dit rooster."
|
||||
|
||||
#: apps/schedule/models.py:46
|
||||
#: apps/schedule/models.py:86
|
||||
msgid "Schedule input"
|
||||
msgstr "Rooster invoer"
|
||||
|
||||
#: apps/schedule/models.py:46
|
||||
#: apps/schedule/models.py:86
|
||||
msgid "The schedule input in JSON format based on the form data"
|
||||
msgstr "De rooster invoer in JSON-indeling op basis van de formuliergegevens"
|
||||
|
||||
#: apps/schedule/models.py:51
|
||||
#: apps/schedule/models.py:88
|
||||
msgid "Peregrine JSON output"
|
||||
msgstr "Peregrine JSON uitvoer"
|
||||
|
||||
#: apps/schedule/models.py:51
|
||||
#: apps/schedule/models.py:88
|
||||
msgid "The results from the Peregrine job in JSON"
|
||||
msgstr "De resultaten van de Peregrine-taak in JSON"
|
||||
|
||||
#: apps/schedule/models.py:53
|
||||
#: apps/schedule/models.py:90
|
||||
msgid "Peregrine binary output"
|
||||
msgstr "Peregrine binaire uitvoer"
|
||||
|
||||
#: apps/schedule/models.py:53
|
||||
#: apps/schedule/models.py:90
|
||||
msgid "This is the output in binary format from the Peregrine cluster"
|
||||
msgstr "Dit is de uitvoer in binair formaat van het Peregrine-cluster"
|
||||
|
||||
#: apps/schedule/models.py:55
|
||||
#: apps/schedule/models.py:92
|
||||
msgid "Report is send to user"
|
||||
msgstr "Rapport is naar gebruiker gestuurd"
|
||||
|
||||
#: apps/schedule/models.py:55
|
||||
#: apps/schedule/models.py:92
|
||||
msgid "The date and time when the report has sended to the user."
|
||||
msgstr "De datum en tijd waarop het rapport naar de gebruiker is verzonden."
|
||||
|
||||
#: apps/schedule/models.py:57
|
||||
#: apps/schedule/models.py:94
|
||||
msgid "Peregrine logging"
|
||||
msgstr "Peregrine log"
|
||||
|
||||
#: apps/schedule/models.py:57
|
||||
#: apps/schedule/models.py:94
|
||||
msgid "Here you can see the logging of the Peregrine job."
|
||||
msgstr "Hier kunt u de logfile van de Peregrine opdracht zien."
|
||||
|
||||
@ -161,23 +174,56 @@ msgstr "Aangemaakt"
|
||||
msgid "Updated"
|
||||
msgstr "Bijgewerkt"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:16
|
||||
msgid "Running"
|
||||
msgstr "Bezig"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:17
|
||||
msgid "Report"
|
||||
msgstr "Rapport"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:18
|
||||
msgid "Actions"
|
||||
msgstr "Acties"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:33
|
||||
msgid "Resume"
|
||||
msgstr "Hervat"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:35
|
||||
msgid "Clone"
|
||||
msgstr "Dupliceer"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_list.html:41
|
||||
msgid "No schedules available"
|
||||
msgstr "Geen roosters beschikbaar"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:5
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:6
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:7
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:16
|
||||
msgid "Resume schedule"
|
||||
msgstr "Hervat rooster"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:9
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:18
|
||||
msgid "Clone schedule"
|
||||
msgstr "Dupliceer rooster"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:11
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:20
|
||||
msgid "New schedule"
|
||||
msgstr "Nieuwe rooster"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:432
|
||||
msgid "Save as draft"
|
||||
msgstr "Sla op als concept"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:434
|
||||
msgid "Submit"
|
||||
msgstr "Verstuur"
|
||||
|
||||
#: apps/schedule/templates/schedule/schedule_new.html:821
|
||||
msgid "and"
|
||||
msgstr "en"
|
||||
|
||||
#~ msgid "Running"
|
||||
#~ msgstr "Bezig"
|
||||
|
||||
#~ msgid "Peregrine input"
|
||||
#~ msgstr "Peregrine invoer"
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
# Generated by Django 3.0.6 on 2020-05-19 13:51
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('employee', '0004_auto_20200519_1351'),
|
||||
('schedule', '0005_auto_20200519_0821'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='schedule',
|
||||
name='employee',
|
||||
field=models.ForeignKey(help_text='Select the employee that is responsible for this schedule request', on_delete=django.db.models.deletion.CASCADE, to='employee.Employee', verbose_name='employee'),
|
||||
),
|
||||
]
|
@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.0.6 on 2020-06-08 08:53
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('schedule', '0006_auto_20200519_1351'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='schedule',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('draft', 'Draft'), ('new', 'New'), ('accepted', 'Accepted'), ('processing', 'Processing'), ('processed', 'Processed'), ('done', 'Done'), ('invalid', 'Invalid'), ('failure', 'Failure')], db_index=True, default='new', help_text='The status of this schedule.', max_length=10, verbose_name='Status'),
|
||||
),
|
||||
]
|
@ -23,6 +23,8 @@ class Schedule(MetaDataModel):
|
||||
The email address where the results should be sent to. Max length is 100 characters.
|
||||
status : ScheduleStatus
|
||||
The status of the schedule.
|
||||
planning_source : JSON
|
||||
The complete schedule stored in JSON data object.
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
@ -32,6 +34,10 @@ class Schedule(MetaDataModel):
|
||||
class ScheduleStatus(models.TextChoices):
|
||||
"""This is a sub class of Schedule which holds all the possible schedule statuses
|
||||
|
||||
.. data:: DRAFT
|
||||
|
||||
The schedule is just created but not finished. Schedules in this state can be updated later on.
|
||||
|
||||
.. data:: NEW
|
||||
|
||||
The schedule is just created and waiting to be picked up by the Peregrine scripts.
|
||||
@ -61,6 +67,7 @@ class Schedule(MetaDataModel):
|
||||
Something when wrong on Peregrine. Look at the logging output of the Peregrine job
|
||||
|
||||
"""
|
||||
DRAFT = 'draft', _('Draft')
|
||||
NEW = 'new', _('New')
|
||||
ACCEPTED = 'accepted', _('Accepted')
|
||||
PROCESSING = 'processing', _('Processing')
|
||||
@ -69,7 +76,7 @@ class Schedule(MetaDataModel):
|
||||
INVALID = 'invalid', _('Invalid')
|
||||
FAILURE = 'failure', _('Failure')
|
||||
|
||||
employee = models.ForeignKey(Employee, on_delete=models.CASCADE, help_text=_('Select the employee that is responsible for this schedule request'))
|
||||
employee = models.ForeignKey(Employee, verbose_name=Employee._meta.verbose_name, on_delete=models.CASCADE, help_text=_('Select the employee that is responsible for this schedule request'))
|
||||
|
||||
name = models.CharField(_('Name'), max_length=100, help_text=_('Name of the schedule'))
|
||||
email = models.CharField(_('Email address'), max_length=100, help_text=_('Email address where the results will be sent to.'))
|
||||
|
@ -24,7 +24,13 @@
|
||||
<td>{{ schedule.updated_at|date:"SHORT_DATETIME_FORMAT" }}</td>
|
||||
<td>{{ schedule.get_status_display }}</td>
|
||||
<td>None</td>
|
||||
<td><a href="{% url 'schedule:clone' schedule_id=schedule.id %}">Clone</a></td>
|
||||
<td>
|
||||
{% if schedule.status == 'draft' %}
|
||||
<a href="{% url 'schedule:edit' schedule_id=schedule.id %}">{% trans "Resume" %}</a>
|
||||
{% else %}
|
||||
<a href="{% url 'schedule:clone' schedule_id=schedule.id %}">{% trans "Clone" %}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr>
|
||||
|
@ -2,12 +2,36 @@
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{% if form.json.value %}{% trans "Clone schedule" %}{% else %}{% trans "New schedule" %}{% endif %}{% endblock %}
|
||||
{% block pagetitle %}{% if form.json.value %}{% trans "Clone schedule" %}{% else %}{% trans "New schedule" %}{% endif %}{% endblock %}
|
||||
{% block title %}
|
||||
{% if form.status.value == 'draft' %}
|
||||
{% trans "Resume schedule" %}
|
||||
{% elif form.json.value %}
|
||||
{% trans "Clone schedule" %}
|
||||
{% else %}
|
||||
{% trans "New schedule" %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block pagetitle %}
|
||||
{% if form.status.value == 'draft' %}
|
||||
{% trans "Resume schedule" %}
|
||||
{% elif form.json.value %}
|
||||
{% trans "Clone schedule" %}
|
||||
{% else %}
|
||||
{% trans "New schedule" %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<form method="POST" action="{% url 'schedule:new' %}" id="new_schedule_form">
|
||||
|
||||
{% if form.status.value == 'draft' %}
|
||||
<form method="POST" action="" id="new_schedule_form">
|
||||
{% else %}
|
||||
<form method="POST" action="{% url 'schedule:new' %}" id="new_schedule_form">
|
||||
{% endif %}
|
||||
|
||||
|
||||
{% csrf_token %}
|
||||
{{ form.json }}
|
||||
{{ form.status }}
|
||||
<h1>Algemene informatie</h1>
|
||||
<p>Als een afdeling meerdere wachtkamers heeft, vul dan dit formulier meerdere keren in; een keer voor elke groep van behandelkamers die een wachtkamer delen.</p>
|
||||
<table>
|
||||
@ -23,7 +47,6 @@
|
||||
<small id="afdelingnaamHelp" class="form-text text-muted">Geef de naam op van de afdeling</small>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="id_email">Emailadres voor de resultaten</label>
|
||||
@ -35,7 +58,6 @@
|
||||
<small id="emailadresHelp" class="form-text text-muted">Geef het emailadres op om de uitkomsten te ontvangen</small>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="patienten">Aantal patiënten dat kan wachten in wachtkamer</label>
|
||||
@ -49,16 +71,13 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<hr>
|
||||
<br />
|
||||
|
||||
<h1>Specialisaties binnen de afdeling</h1>
|
||||
<div class="poliekliniek_specialisatie">
|
||||
<table>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="specialisatie_0" class="h4">Specialisatie 1</label>
|
||||
@ -70,7 +89,6 @@
|
||||
<small id="specialisatie_0Help" class="form-text text-muted" style="float:right;display:none"><a href="#">Verwijder</a></small>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="specialisatie_afkorting_0">Specialisatie afkorting</label>
|
||||
@ -82,19 +100,6 @@
|
||||
<small id="specialisatie_0Help" class="form-text text-muted">Geef een afkorting op voor deze specialisatie. Deze gebruiken wij in de figuren van de rapportage.</small>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="specialisatie_aantal_artsen_0">Aantal artsen</label>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="number" class="form-control" min="1" max="100" id="specialisatie_aantal_artsen_0" name="specialisatie_aantal_artsen_0" aria-describedby="specialisatie_aantal_artsen_0Help" required>
|
||||
<small id="specialisatie_aantal_artsen_0Help" class="form-text text-muted">Maximaal aantal artsen dat op enig moment tegelijk aan het werk zou kunnen zijn.</small>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>
|
||||
<label for="specialisatie_aantal_kamers_0">Aantal behandelkamers</label>
|
||||
@ -106,19 +111,18 @@
|
||||
<small id="specialisatie_aantal_kamers_0Help" class="form-text text-muted">Aantal behandelkamers dat beschikbaar is per specialisatie</small>
|
||||
</td>
|
||||
</tr>
|
||||
<!--
|
||||
<tr>
|
||||
<th>
|
||||
<label for="specialisatie_aantal_behandelingen_0">Aantal verschillende soorten behandelingen</label>
|
||||
<label for="specialisatie_aantal_artsen_0">Aantal artsen</label>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<input type="number" class="form-control" min="0" max="100" id="specialisatie_aantal_behandelingen_0" name="specialisatie_aantal_behandelingen_0" aria-describedby="specialisatie_aantal_behandelingen_0Help" required>
|
||||
<small id="specialisatie_aantal_behandelingen_0Help" class="form-text text-muted"></small>
|
||||
<input type="number" class="form-control" min="1" max="100" id="specialisatie_aantal_artsen_0" name="specialisatie_aantal_artsen_0" aria-describedby="specialisatie_aantal_artsen_0Help" required>
|
||||
<small id="specialisatie_aantal_artsen_0Help" class="form-text text-muted">Maximaal aantal artsen dat op enig moment tegelijk aan het werk kan zijn (dit kan niet meer zijn dan het aantal behandelkamers).<br /><strong>Let op</strong>: dit gaat om fulltime artsen, twee 50% parttime artsen moet worden ingevuld als één arts.</small>
|
||||
<br /><br />
|
||||
</td>
|
||||
</tr>
|
||||
-->
|
||||
<tr>
|
||||
<th>
|
||||
<label>Werktijden <small class="text-danger" style="display:none"> Nog niet volledig</small></label>
|
||||
@ -192,7 +196,6 @@
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>ochtendpauze</th>
|
||||
<td>
|
||||
@ -227,7 +230,6 @@
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>lunchpauze</th>
|
||||
<td>
|
||||
@ -265,7 +267,6 @@
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>middagpauze</th>
|
||||
<td>
|
||||
@ -278,19 +279,15 @@
|
||||
<option value="1515">15:15</option>
|
||||
<option value="1530">15:30</option>
|
||||
<option value="1545">15:45</option>
|
||||
|
||||
<option value="1600">16:00</option>
|
||||
<option value="1615">16:15</option>
|
||||
<option value="1630">16:30</option>
|
||||
<option value="1645">16:45</option>
|
||||
|
||||
<option value="1700">17:00</option>
|
||||
<option value="1715">17:15</option>
|
||||
<option value="1730">17:30</option>
|
||||
<option value="1745">17:45</option>
|
||||
|
||||
<option value="1800">18:00</option>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@ -302,65 +299,52 @@
|
||||
<option value="1515">15:15</option>
|
||||
<option value="1530">15:30</option>
|
||||
<option value="1545">15:45</option>
|
||||
|
||||
<option value="1600">16:00</option>
|
||||
<option value="1615">16:15</option>
|
||||
<option value="1630">16:30</option>
|
||||
<option value="1645">16:45</option>
|
||||
|
||||
<option value="1700">17:00</option>
|
||||
<option value="1715">17:15</option>
|
||||
<option value="1730">17:30</option>
|
||||
<option value="1745">17:45</option>
|
||||
|
||||
<option value="1800">18:00</option>
|
||||
<option value="1815">18:15</option>
|
||||
<option value="1830">18:30</option>
|
||||
<option value="1845">18:45</option>
|
||||
|
||||
<option value="1900">19:00</option>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center; width: 100%; margin-top: 15px"><a href="#" class="add_specialisatie">klik hier om een extra specialisatie toe te voegen</a></div>
|
||||
|
||||
<br />
|
||||
<hr>
|
||||
<br />
|
||||
|
||||
<h1>Behandelingen</h1>
|
||||
<p>In het model worden slots van 5 minuten gebruikt voor het bepalen van starttijden. etc. Afspraken starten daarmee om bijv. 10.00, 10.05, 10.10.<br />Afspraakduur wordt daarmee ook in veelvouden van 5 minuten gevraagd.</p>
|
||||
<p>Zowel afspraketabel_behandelingenn waar de patiënt fysiek in het ziekenhuis is, als wel telefoongesprekken worden hier gevraagd. Beide type afspraken kunnen in het raster worden gepland.</p>
|
||||
<p>Normaal aantal: Geef hier het aantal afspraken op dat van dit type <strong style="text-decoration: underline">per dag</strong> gebruikelijk was, voordat COVID-19 begon.<br />
|
||||
Gewenst als op 30%: Geef hier het aantal afspraken <strong style="text-decoration: underline">per dag</strong> op dat u zou willen hebben als de afdeling maar op 30% van de normale capaciteit zou kunnen draaien.</p>
|
||||
|
||||
<p>Zowel afspraken waar de patiënt fysiek in het ziekenhuis is, als wel telefoongesprekken worden hier gevraagd. Beide type afspraken kunnen in het raster worden gepland.</p>
|
||||
<p>Normaal aantal: Geef hier het aantal afspraken op dat van dit type <strong style="text-decoration: underline">per dag</strong> gebruikelijk was, voordat COVID-19 begon.<br />Gewenst als op 30%: Geef hier het aantal afspraken <strong style="text-decoration: underline">per dag</strong> op dat u zou willen hebben als de afdeling maar op 30% van de normale capaciteit zou kunnen draaien.</p>
|
||||
<table id="tabel_behandelingen">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Naam behandeling</th>
|
||||
<th>Duur (in minuten)</th>
|
||||
<th>Specialisatie</th>
|
||||
<th>Methode</th>
|
||||
<th>Normaal aantal</th>
|
||||
<th>Gewenst als op 30%</th>
|
||||
<th class="pointer">Naam behandeling</th>
|
||||
<th class="pointer">Duur (in minuten)</th>
|
||||
<th class="pointer">Specialisatie</th>
|
||||
<th class="pointer">Methode</th>
|
||||
<th class="pointer">Normaal aantal</th>
|
||||
<th class="pointer">Gewenst als op 30%</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="behandeling">
|
||||
<td><input type="text" class="form-control" id="behandeling_0" name="behandeling_0" required></td>
|
||||
<td><input type="text" class="form-control" id="behandeling_0" name="behandeling_0" maxlength="20" required></td>
|
||||
<td>
|
||||
<select class="form-control" id="behandeling_duration_0" name="behandeling_duration_0" required>
|
||||
<option value="5">5</option>
|
||||
@ -381,6 +365,11 @@
|
||||
<option value="80">80</option>
|
||||
<option value="85">85</option>
|
||||
<option value="90">90</option>
|
||||
<option value="120">120</option>
|
||||
<option value="150">150</option>
|
||||
<option value="180">180</option>
|
||||
<option value="210">210</option>
|
||||
<option value="240">240</option>
|
||||
</select>
|
||||
</td>
|
||||
<td>
|
||||
@ -392,11 +381,9 @@
|
||||
<option value="phone">telefonisch</option>
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<input type="number" class="form-control behandeling_calc" id="behandeling_100p_0" name="behandeling_100p_0" min="0" max="100" required>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
<input type="number" class="form-control behandeling_calc" id="behandeling_30p_0" name="behandeling_30p_0" min="0" max="100" required>
|
||||
<small style="float:right;"><a href="#">Verwijder</a></small>
|
||||
@ -404,9 +391,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div style="text-align: center; width: 100%; margin-top: 15px"><a href="#" class="add_behandeling">klik hier om een nieuwe behandeling toe te voegen</a></div>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
<tr class="behandeling_calc_summary">
|
||||
@ -414,51 +399,40 @@
|
||||
<td style="text-align: center">0</td>
|
||||
<td style="text-align: center">0</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<div class="behandeling_calc_remarks"></div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="3" class="behandeling_calc_time">
|
||||
|
||||
</td>
|
||||
<td colspan="3" class="behandeling_calc_time"></td>
|
||||
</tr>
|
||||
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<hr>
|
||||
<br />
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><input type="checkbox" value="1" name="privacy_verklaring" required > </td>
|
||||
<td>Met het verzenden van dit formulier gaat u akkoord met de <a href="https://www.rug.nl/about-us/organization/rules-and-regulations/algemeen/20180423-algemeen-privacyverklaring-rug.pdf" target="_blank" title="RUG Privacyverklaring">privacyverklaring</a> van de Rijksuniversiteit Groningen.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><input type="checkbox" value="1" name="rug_vrijwaring" required > </td>
|
||||
<td>De Rijksuniversiteit Groningen (RUG) biedt geen garantie terzake van de juistheid of de bruikbaarheid van het door haar ontwikkelde model en aanverwante documenten. De afnemer/gebruiker vrijwaart de RUG voor aanspraken van derden die jegens RUG mochten worden gedaan naar aanleiding van schades, voortvloeiend uit het gebruik of de toepassing van het model en aanverwante documenten. Alle rechten, waaronder de intellectuele eigendomsrechten, op het model en bijbehorende documenten, blijven te allen tijde voorbehouden aan de RUG.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><input type="checkbox" value="1" name="data_verwerking" required > </td>
|
||||
<td>De gebruiker geeft de RUG toestemming om de ingevoerde data te verwerken in het kader van wetenschappelijk onderzoek en in het kader van het verbeteren van haar tools. De RUG zal over het onderzoek mogen publiceren, ook in andere vormen dan genoemde eindrapportage. De data kunnen in geanonimiseerde vorm in de publicaties worden opgenomen.</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br />
|
||||
<hr>
|
||||
<br />
|
||||
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
<button type="submit" id="save_draft" class="btn btn-primary">{% trans "Save as draft" %}</button>
|
||||
-
|
||||
<button type="submit" id="save_new" class="btn btn-primary">{% trans "Submit" %}</button>
|
||||
</form>
|
||||
|
||||
<script type="text/javascript">
|
||||
function addSpecialisatie() {
|
||||
var clone = jQuery('div.poliekliniek_specialisatie:first').clone()
|
||||
@ -486,13 +460,18 @@
|
||||
element = jQuery(element);
|
||||
var nr = counter; // We are starting with 0 so the amount is the new number
|
||||
element.find('label').first().text('Specialisatie ' + (nr + 1));
|
||||
element.find('select,input').each(function(index,selectitem){
|
||||
element.find('select,input,label').each(function(index,selectitem){
|
||||
selectitem = jQuery(selectitem);
|
||||
selectitem.prop('name',selectitem.prop('name').replace(/_\d+$/,'_' + nr));
|
||||
selectitem.prop('id',selectitem.prop('id').replace(/_\d+$/,'_' + nr));
|
||||
if (selectitem.is('label')) {
|
||||
selectitem.prop('for',selectitem.prop('for').replace(/_\d+$/,'_' + nr));
|
||||
} else {
|
||||
//console.log(selectitem,selectitem.prop('name'),selectitem.prop('id') );
|
||||
selectitem.prop('name',selectitem.prop('name').replace(/_\d+$/,'_' + nr));
|
||||
selectitem.prop('id',selectitem.prop('id').replace(/_\d+$/,'_' + nr));
|
||||
|
||||
if (selectitem.attr('aria-describedby')) {
|
||||
selectitem.attr('aria-describedby',selectitem.attr('aria-describedby').replace(/_\d+Help$/,'_' + nr + 'Help'));
|
||||
if (selectitem.attr('aria-describedby')) {
|
||||
selectitem.attr('aria-describedby',selectitem.attr('aria-describedby').replace(/_\d+Help$/,'_' + nr + 'Help'));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -502,8 +481,18 @@
|
||||
updateSpecialisatieValues();
|
||||
});
|
||||
|
||||
jQuery('input[name^="specialisatie_aantal_artsen_"]').off('change keyup').on('change keyup',function(){
|
||||
calculateBehandelingen();
|
||||
validate_doctors_vs_rooms();
|
||||
});
|
||||
|
||||
jQuery('input[name^="specialisatie_aantal_kamers_"]').off('change keyup').on('change keyup',function(){
|
||||
validate_doctors_vs_rooms();
|
||||
});
|
||||
|
||||
jQuery('div.werktijden select').off('change').on('change',function(event){
|
||||
check_working_hours(jQuery(this).parentsUntil('.werktijden').parent());
|
||||
calculateBehandelingen();
|
||||
});
|
||||
}
|
||||
|
||||
@ -569,12 +558,21 @@
|
||||
}
|
||||
|
||||
function calculateBehandelingen() {
|
||||
const max_limit = 0.4; // Max 40% van het maximum
|
||||
let total = 0, percentage = 0;
|
||||
let error = false;
|
||||
let show_message = false;
|
||||
|
||||
jQuery('tr.behandeling').each(function(counter,row){
|
||||
row = jQuery(row);
|
||||
if (row.find('select[name^="behandeling_method_"]').val() == 'live') {
|
||||
if (!show_message) {
|
||||
show_message = ( row.find('input[name^="behandeling_"]').val() !== ''
|
||||
&& row.find('select[name^="behandeling_specialisme_"]').val() !== ''
|
||||
&& row.find('input[name^="behandeling_100p_"]').val() !== ''
|
||||
&& row.find('input[name^="behandeling_30p_"]').val() !== '' )
|
||||
}
|
||||
|
||||
total += (row.find('input[name*="_100p_"]').val() != '' ? row.find('input[name*="_100p_"]').val() * 1 : 0);
|
||||
percentage += (row.find('input[name*="_30p_"]').val() != '' ? row.find('input[name*="_30p_"]').val() * 1 : 0);
|
||||
}
|
||||
@ -586,18 +584,22 @@
|
||||
let calc_message = '';
|
||||
let class_message = '';
|
||||
|
||||
if (percentage > (total * 0.3)) {
|
||||
calc_message = 'U heeft ' + Math.ceil(percentage - (total * 0.3)) + ' teveel afspraken geselecteerd voor het 30% scenario';
|
||||
if (percentage > (total * max_limit)) {
|
||||
calc_message = 'U heeft ' + Math.ceil(percentage - (total * max_limit)) + ' afspraken teveel geselecteerd voor het 30% scenario';
|
||||
class_message = 'alert-danger';
|
||||
error = true;
|
||||
} else if ((total * 0.3) - percentage >= 1) {
|
||||
calc_message = 'U kunt nog '+ Math.floor((total * 0.3) - percentage) +' afspraken toevoegen voor het 30% scenario';
|
||||
class_message = 'alert-warning';
|
||||
} else if ((total * max_limit) - percentage >= 1) {
|
||||
//calc_message = 'U kunt nog '+ Math.floor((total * max_limit - percentage) +' afspraken toevoegen voor het 30% scenario';
|
||||
//class_message = 'alert-warning';
|
||||
} else {
|
||||
calc_message = 'Dit klopt precies';
|
||||
class_message = 'alert-success';
|
||||
}
|
||||
jQuery('div.behandeling_calc_remarks').removeClass('alert-danger alert-warning alert-success').addClass(class_message).text(calc_message);
|
||||
|
||||
jQuery('div.behandeling_calc_remarks').removeClass('alert-danger alert-warning alert-success').html('');
|
||||
if (show_message) {
|
||||
jQuery('div.behandeling_calc_remarks').addClass(class_message).text(calc_message);
|
||||
}
|
||||
|
||||
validate_behandeling_hours();
|
||||
|
||||
@ -612,6 +614,13 @@
|
||||
dir = "asc";
|
||||
/* Make a loop that will continue until
|
||||
no switching has been done: */
|
||||
|
||||
// Normal sorting is done on text based.
|
||||
mode = 'text';
|
||||
if ([1,4,5].indexOf(n) !== -1) {
|
||||
// but for some colums, we want to use number soring.
|
||||
mode = 'number';
|
||||
}
|
||||
while (switching) {
|
||||
// Start by saying: no switching is done:
|
||||
switching = false;
|
||||
@ -629,14 +638,21 @@
|
||||
based on the direction, asc or desc: */
|
||||
var value_x = jQuery(x).find('select').length > 0 ? jQuery(x).find('select') : jQuery(x).find('input');
|
||||
var value_y = jQuery(y).find('select').length > 0 ? jQuery(y).find('select') : jQuery(y).find('input');
|
||||
|
||||
if (dir == "asc") {
|
||||
if (value_x.val().toLowerCase() > value_y.val().toLowerCase()) {
|
||||
if (
|
||||
('text' == mode && value_x.val().toLowerCase() > value_y.val().toLowerCase()) ||
|
||||
('number' == mode && (value_x.val() * 1) > (value_y.val() * 1))
|
||||
) {
|
||||
// If so, mark as a switch and break the loop:
|
||||
shouldSwitch = true;
|
||||
break;
|
||||
}
|
||||
} else if (dir == "desc") {
|
||||
if (value_x.val().toLowerCase() < value_y.val().toLowerCase()) {
|
||||
if (
|
||||
('text' == mode && value_x.val().toLowerCase() < value_y.val().toLowerCase()) ||
|
||||
('number' == mode && (value_x.val() * 1) < (value_y.val() * 1))
|
||||
) {
|
||||
// If so, mark as a switch and break the loop:
|
||||
shouldSwitch = true;
|
||||
break;
|
||||
@ -662,6 +678,19 @@
|
||||
updateBehandelingen();
|
||||
}
|
||||
|
||||
function validate_doctors_vs_rooms() {
|
||||
//let behandelingen = {};
|
||||
jQuery('div.poliekliniek_specialisatie').each(function(index,element){
|
||||
element = jQuery(element);
|
||||
|
||||
let amount_of_doctors = element.find('input[name^="specialisatie_aantal_artsen_"]').val() * 1;
|
||||
let amount_of_rooms = element.find('input[name^="specialisatie_aantal_kamers_"]').val() * 1;
|
||||
|
||||
// Use HTML5 validators from the browser and chage the max value based on the amount of rooms available
|
||||
element.find('input[name^="specialisatie_aantal_artsen_"]').prop('max',amount_of_rooms);
|
||||
});
|
||||
}
|
||||
|
||||
function validate_behandeling_hours() {
|
||||
let behandelingen = {};
|
||||
jQuery('div.poliekliniek_specialisatie').each(function(index,element){
|
||||
@ -670,12 +699,13 @@
|
||||
let specialisme = element.find('input[name^="specialisatie_"]').val();
|
||||
|
||||
behandelingen[specialisme] = {
|
||||
name : element.find('input[name^="specialisatie_"]').val(),
|
||||
artsen : element.find('input[name^="specialisatie_aantal_artsen_"]').val(),
|
||||
max_time : 0,
|
||||
used_time : 0
|
||||
name : element.find('input[name^="specialisatie_"]').val(),
|
||||
artsen : element.find('input[name^="specialisatie_aantal_artsen_"]').val() * 1,
|
||||
max_time : 0,
|
||||
used_time : 0
|
||||
};
|
||||
|
||||
// Hole working day, first time row
|
||||
let time_start_value = element.find('select[name^="werkdag_start_afdeling_"]').val() * 1;
|
||||
let time_end_value = element.find('select[name^="werkdag_end_afdeling_"]').val() * 1;
|
||||
|
||||
@ -693,11 +723,10 @@
|
||||
time_end.setSeconds(0);
|
||||
time_end.setMilliseconds(0);
|
||||
|
||||
//console.log(time_start,time_end);
|
||||
|
||||
behandelingen[specialisme]['max_time'] = ((time_end - time_start) / (1000 * 60));
|
||||
}
|
||||
|
||||
// Morning break. Second row
|
||||
time_start_value = element.find('select[name^="ochtend_pauze_start_afdeling_"]').val() * 1;
|
||||
time_end_value = element.find('select[name^="ochtend_pauze_end_afdeling_"]').val() * 1;
|
||||
|
||||
@ -715,8 +744,6 @@
|
||||
time_end.setSeconds(0);
|
||||
time_end.setMilliseconds(0);
|
||||
|
||||
//console.log(time_start,time_end);
|
||||
|
||||
behandelingen[specialisme]['max_time'] -= ((time_end - time_start) / (1000 * 60));
|
||||
}
|
||||
|
||||
@ -785,13 +812,19 @@
|
||||
message.html('')
|
||||
|
||||
jQuery.each(behandelingen,function(specialisme,obj){
|
||||
if (obj.max_time - obj.used_time < 0) {
|
||||
if ('' == specialisme) {
|
||||
return;
|
||||
}
|
||||
if ((obj.artsen * obj.max_time) - obj.used_time < 0) {
|
||||
error = true;
|
||||
message.append(jQuery('<div>').addClass('alert-danger').html('<strong>' + specialisme + ' </strong>: Te veel behandelingen voor het aantal arsten en werktijd. ' + (obj.used_time - obj.max_time) + ' Minuten teveel.'));
|
||||
} else if (obj.max_time - obj.used_time == 0) {
|
||||
duration_to_much = (obj.used_time - (obj.artsen * obj.max_time)) * 60 * 1000;
|
||||
duration_to_much = humanizeDuration(duration_to_much, {language: moment.locale(), delimiter: ' {% trans "and" %} ', units: ['h','m']});
|
||||
message.append(jQuery('<div>').addClass('alert-danger').html('<strong>' + specialisme + ' </strong>: Te veel behandelingen voor het aantal artsen en werktijd. ' + duration_to_much + ' te veel.'));
|
||||
} else if ((obj.artsen * obj.max_time) - obj.used_time == 0) {
|
||||
message.append(jQuery('<div>').addClass('alert-success').html('<strong>' + specialisme + ' </strong>: Perfect! Alle tijd is ingedeeld.'));
|
||||
} else {
|
||||
message.append(jQuery('<div>').addClass('alert-warning').html('<strong>' + specialisme + ' </strong>: Uw heeft nog ' + (obj.max_time - obj.used_time) + ' minuten tijd over voor meer afspraken.'));
|
||||
// do not show this message here, as it is hard to predict the maximum available time
|
||||
// message.append(jQuery('<div>').addClass('alert-warning').html('<strong>' + specialisme + ' </strong>: Uw heeft nog ' + moment.duration((obj.artsen * obj.max_time) - obj.used_time,'minutes').humanize() + ' tijd over voor meer afspraken.'));
|
||||
}
|
||||
});
|
||||
|
||||
@ -840,18 +873,35 @@
|
||||
});
|
||||
|
||||
morning_break_end.find('option').each(function(index,element){
|
||||
if ('' !== element.value && element.value > 0) {
|
||||
if ('' !== element.value && element.value >= 0) {
|
||||
// Only allow options that are between the day start and day end.
|
||||
// Or when morning_break_start is selected and valid, add period time for end time selections
|
||||
// When start time is selected, the option 'no break' is not valid (value 0)
|
||||
let time = ('' != morning_break_start.val() ? morning_break_start.val() : day_start.val());
|
||||
let disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
if (element.selected && disable) {
|
||||
let disable = false;
|
||||
|
||||
// Selected no-break at morning starting time and select no-break here
|
||||
if (time == 0 && element.value == 0) {
|
||||
disable = false;
|
||||
} else if (time == 0) {
|
||||
disable = element.value != 0;
|
||||
} else if (element.value == 0) {
|
||||
disable = '' != morning_break_start.val();
|
||||
} else {
|
||||
disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
}
|
||||
|
||||
if(element.selected && disable) {
|
||||
morning_break_end.val('');
|
||||
}
|
||||
element.disabled = disable;
|
||||
}
|
||||
});
|
||||
|
||||
if (morning_break_start.val() == '0') {
|
||||
morning_break_end.val('0');
|
||||
}
|
||||
|
||||
lunch_start.find('option').each(function(index,element){
|
||||
if ('' !== element.value && element.value > 0) {
|
||||
// Only allow options that are between the day start and day end.
|
||||
@ -866,11 +916,23 @@
|
||||
});
|
||||
|
||||
lunch_end.find('option').each(function(index,element){
|
||||
if ('' !== element.value && element.value > 0) {
|
||||
if ('' !== element.value && element.value >= 0) {
|
||||
// Only allow options that are between the day start and day end.
|
||||
// Or when lunch_start is selected and valid, add period time for end time selections
|
||||
// When start time is selected, the option 'no break' is not valid (value 0)
|
||||
let time = ('' != lunch_start.val() ? lunch_start.val() : day_start.val()) * 1;
|
||||
let disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
let disable = false;
|
||||
|
||||
if (time == 0 && element.value == 0) {
|
||||
disable = false;
|
||||
} else if (time == 0) {
|
||||
disable = element.value != 0;
|
||||
} else if (element.value == 0) {
|
||||
disable = '' != lunch_start.val();
|
||||
} else {
|
||||
disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
}
|
||||
|
||||
if (element.selected && disable) {
|
||||
lunch_end.val('');
|
||||
}
|
||||
@ -878,6 +940,10 @@
|
||||
}
|
||||
});
|
||||
|
||||
if (lunch_start.val() == '0') {
|
||||
lunch_end.val('0');
|
||||
}
|
||||
|
||||
|
||||
afternoon_break_start.find('option').each(function(index,element){
|
||||
if ('' !== element.value && element.value > 0) {
|
||||
@ -893,11 +959,23 @@
|
||||
});
|
||||
|
||||
afternoon_break_end.find('option').each(function(index,element){
|
||||
if ('' !== element.value && element.value > 0) {
|
||||
if ('' !== element.value && element.value >= 0) {
|
||||
// Only allow options that are between the day start and day end.
|
||||
// Or when morning_break_start is selected and valid, add period time for end time selections
|
||||
// When start time is selected, the option 'no break' is not valid (value 0)
|
||||
let time = ('' != afternoon_break_start.val() ? afternoon_break_start.val() : day_start.val());
|
||||
let disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
let disable = false;
|
||||
|
||||
if (time == 0 && element.value == 0) {
|
||||
disable = false;
|
||||
} else if (time == 0) {
|
||||
disable = element.value != 0;
|
||||
} else if (element.value == 0) {
|
||||
disable = '' != afternoon_break_start.val();
|
||||
} else {
|
||||
disable = (time && element.value <= time) || (day_end.val() && element.value > day_end.val());
|
||||
}
|
||||
|
||||
if (element.selected && disable) {
|
||||
afternoon_break_end.val('');
|
||||
}
|
||||
@ -905,6 +983,10 @@
|
||||
}
|
||||
});
|
||||
|
||||
if (afternoon_break_start.val() == '0') {
|
||||
afternoon_break_end.val('0');
|
||||
}
|
||||
|
||||
if (showerror) {
|
||||
html.find('small.text-danger').toggle(day_start.val() == '' || day_start.val() == null ||
|
||||
day_end.val() == '' || day_end.val() == null ||
|
||||
@ -956,12 +1038,6 @@
|
||||
jQuery('div.poliekliniek_specialisatie input').off('change').on('change',function(){
|
||||
updateSpecialisatieValues();
|
||||
});
|
||||
{% comment %}
|
||||
jQuery('a.add_behandelkamer').on('click',function(event){
|
||||
event.preventDefault();
|
||||
addBehandelkamer();
|
||||
});
|
||||
{% endcomment %}
|
||||
|
||||
jQuery('a.add_behandeling').on('click',function(event){
|
||||
event.preventDefault();
|
||||
@ -979,10 +1055,27 @@
|
||||
});
|
||||
});
|
||||
|
||||
jQuery('input[name^="specialisatie_aantal_artsen_"]').off('change keyup').on('change keyup',function(){
|
||||
calculateBehandelingen();
|
||||
validate_doctors_vs_rooms();
|
||||
});
|
||||
|
||||
jQuery('input[name^="specialisatie_aantal_kamers_"]').off('change keyup').on('change keyup',function(){
|
||||
validate_doctors_vs_rooms();
|
||||
});
|
||||
|
||||
jQuery('tr.behandeling :input').off('change keyup').on('change keyup',function(event){
|
||||
calculateBehandelingen();
|
||||
});
|
||||
|
||||
jQuery('#save_draft').on('click',function(event){
|
||||
jQuery('input#id_status').val('draft');
|
||||
});
|
||||
|
||||
jQuery('#save_new').on('click',function(event){
|
||||
jQuery('input#id_status').val('new');
|
||||
});
|
||||
|
||||
jQuery('form#new_schedule_form').on('submit',function(event){
|
||||
if (validate_working_hours() &&
|
||||
calculateBehandelingen() &&
|
||||
@ -991,8 +1084,18 @@
|
||||
let formdata = new FormData(this);
|
||||
formdata.delete('csrfmiddlewaretoken');
|
||||
formdata.delete('json');
|
||||
formdata.delete('status');
|
||||
|
||||
jQuery('input#id_json').val(JSON.stringify(Object.fromEntries(formdata)));
|
||||
// Display the key/value pairs. This is needed to support stupid IE. Mici$oft is still having hardtime playing nice :(
|
||||
let json_data = {};
|
||||
var formDataEntries = formdata.entries(), formDataEntry = formDataEntries.next(), pair;
|
||||
while (!formDataEntry.done) {
|
||||
pair = formDataEntry.value;
|
||||
json_data[pair[0]] = pair[1];
|
||||
formDataEntry = formDataEntries.next();
|
||||
}
|
||||
|
||||
jQuery('input#id_json').val(JSON.stringify(json_data));
|
||||
return true;
|
||||
} else {
|
||||
alert('Er zijn wat problemen met het formulier. Controleer de invoer velden');
|
||||
@ -1000,7 +1103,8 @@
|
||||
return false;
|
||||
});
|
||||
|
||||
updateBehandelingen();
|
||||
load_clone_data();
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% endblock %}
|
@ -6,7 +6,6 @@ app_name = 'schedule'
|
||||
urlpatterns = [
|
||||
path('', views.ScheduleListView.as_view(), name='list'),
|
||||
path('new', views.new_or_update_schedule, name='new'),
|
||||
#path('<int:pk>', views.ScheduleDetailView.as_view(), name='detail'),
|
||||
path('<int:schedule_id>/clone', views.new_or_update_schedule, name='clone'),
|
||||
|
||||
path('<int:schedule_id>/edit', views.new_or_update_schedule, name='edit'),
|
||||
]
|
@ -12,6 +12,13 @@ import json
|
||||
|
||||
# Create your views here.
|
||||
class ScheduleListView(LoginRequiredMixin,ListView):
|
||||
"""
|
||||
This view will give a list of all entered schedules. The list is filtered on the logged in employee.
|
||||
|
||||
Only the schedules owned by the logged in user are shown.
|
||||
|
||||
The results are shown with 10 items per page. A pager will be shown when there are more then 10 schedules
|
||||
"""
|
||||
|
||||
model = Schedule
|
||||
paginate_by = 10
|
||||
@ -21,43 +28,81 @@ class ScheduleListView(LoginRequiredMixin,ListView):
|
||||
|
||||
@login_required
|
||||
def new_or_update_schedule(request, schedule_id = None):
|
||||
"""
|
||||
This view will create or update an existing schedule. At the moment there is not a real update, but a clone functionality.
|
||||
So every schedule that is updated will be stored as a new schedule.
|
||||
|
||||
Only schedules owned by the logged in user can be loaded here and can be cloned.
|
||||
|
||||
The data of the form is stored as a JSON object in a single database field for more flexibility.
|
||||
|
||||
Arguments:
|
||||
request HttpRequest -- This is the HTTP request from the Django framework. This will hold the current logged in user info.
|
||||
|
||||
Keyword Arguments:
|
||||
schedule_id Schedule -- This is the schedule to be edited. When none, a new schedule will be created (default: {None})
|
||||
|
||||
Returns:
|
||||
A view with an empty form to create a new schedule or a prefilled form for cloning.
|
||||
"""
|
||||
template_name = 'schedule/schedule_new.html'
|
||||
|
||||
schedule = None
|
||||
if schedule_id is not None:
|
||||
try:
|
||||
schedule = Schedule.objects.get(pk=schedule_id)
|
||||
# Try loading an existing schedule. Make sure you only load a schedule that is owned by the logged in user!
|
||||
schedule = Schedule.objects.get(pk = schedule_id, employee = request.user.employee)
|
||||
except Schedule.DoesNotExist:
|
||||
# Schedule does not exist, or you do not own the schedule you try to load. Stop playing around on the url bar ;)
|
||||
pass
|
||||
|
||||
if request.method == 'POST':
|
||||
# Load the form data
|
||||
schedule_form = ScheduleForm(request.POST)
|
||||
|
||||
# Check if minimal input fields are correct
|
||||
if schedule_form.is_valid():
|
||||
new_schedule = Schedule()
|
||||
# First time saving. Create a new, empty schedule
|
||||
# Or when the existing schedule has NOT 'draft' status, which means we are cloning an existing schedule
|
||||
if schedule is None or schedule.status != Schedule.ScheduleStatus.DRAFT:
|
||||
schedule = Schedule()
|
||||
|
||||
# Set the schedule status based on the form pressed button. Either new or draft status
|
||||
schedule.status = Schedule.ScheduleStatus.DRAFT if schedule_form.cleaned_data['status'] == 'draft' else Schedule.ScheduleStatus.NEW
|
||||
|
||||
try:
|
||||
new_schedule.planning_source = json.loads(schedule_form.cleaned_data['json'])
|
||||
# Try loading the JSON data from the form
|
||||
schedule.planning_source = json.loads(schedule_form.cleaned_data['json'])
|
||||
except json.JSONDecodeError as ex:
|
||||
new_schedule.planning_source = json.loads(json.dumps({'error': str(ex)}))
|
||||
new_schedule.status = Schedule.ScheduleStatus.INVALID
|
||||
# Something when wrong. The error is saved instead, and can be read out in the admin area
|
||||
schedule.planning_source = json.loads(json.dumps({'error': str(ex)}))
|
||||
schedule.status = Schedule.ScheduleStatus.INVALID
|
||||
|
||||
new_schedule.employee = request.user.employee
|
||||
new_schedule.name = schedule_form.cleaned_data['name']
|
||||
new_schedule.email = schedule_form.cleaned_data['email']
|
||||
|
||||
new_schedule.save()
|
||||
# Make sure that the logged in user that is creating the schedule does become the owner
|
||||
schedule.employee = request.user.employee
|
||||
# Store name of the schedule
|
||||
schedule.name = schedule_form.cleaned_data['name']
|
||||
# Store email address for the results
|
||||
schedule.email = schedule_form.cleaned_data['email']
|
||||
# Save the schedule to the database
|
||||
schedule.save()
|
||||
|
||||
# Return to overview
|
||||
return redirect('schedule:list')
|
||||
|
||||
else:
|
||||
# We start with a new form. Either new of clone/edit
|
||||
status = 'new'
|
||||
json_form = ''
|
||||
if schedule is not None:
|
||||
print(dir(schedule.planning_source))
|
||||
schedule = json.dumps(schedule.planning_source)
|
||||
# The schedule is an existing one. So we are in clone/edit mode. So load the current status and JSON data
|
||||
status = schedule.status
|
||||
json_form = json.dumps(schedule.planning_source)
|
||||
|
||||
print(schedule)
|
||||
schedule_form = ScheduleForm(initial={'json' : schedule})
|
||||
# Create the from logic
|
||||
schedule_form = ScheduleForm(initial={'json' : json_form, 'status' : status})
|
||||
|
||||
# Show the form in the browser
|
||||
return render(request, template_name, {
|
||||
'form' : schedule_form,
|
||||
})
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"PO-Revision-Date: 2020-05-18 11:10+0200\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-06-08 11:57+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: nl\n"
|
||||
@ -36,7 +36,7 @@ msgstr "De datum en tijd waarop dit model is bijgewerkt"
|
||||
|
||||
#: templates/menu.html:4
|
||||
msgid "Het 1,5 meter ziekenhuis"
|
||||
msgstr ""
|
||||
msgstr "Het 1,5 meter ziekenhuis"
|
||||
|
||||
#: templates/menu.html:8 templates/registration/login.html:4
|
||||
#: templates/registration/login.html:5 templates/registration/login.html:8
|
||||
|
@ -14,7 +14,10 @@ INTERNAL_IPS=127.0.0.1
|
||||
DATABASE_URL=sqlite:////opt/poli_planning/polyclinic_scheduling/db.sqlite3
|
||||
|
||||
# The location on disk where the static files will be placed during deployment. Setting is required
|
||||
STATIC_ROOT =
|
||||
STATIC_ROOT=
|
||||
|
||||
# Enter the default timezone for the visitors when it is not known.
|
||||
TIME_ZONE=Europe/Amsterdam
|
||||
|
||||
# Email settings
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -18,12 +18,8 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: polyclinic_scheduling/settings.py:129
|
||||
msgid "Dutch"
|
||||
msgstr ""
|
||||
|
||||
#: polyclinic_scheduling/settings.py:130
|
||||
msgid "English"
|
||||
msgid "Dutch"
|
||||
msgstr ""
|
||||
|
||||
#: polyclinic_scheduling/urls.py:22 polyclinic_scheduling/urls.py:23
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-05-18 14:38+0000\n"
|
||||
"POT-Creation-Date: 2020-06-08 13:43+0200\n"
|
||||
"PO-Revision-Date: 2020-05-15 12:49+0200\n"
|
||||
"Last-Translator: Joshua Rubingh <j.g.rubingh@rug.nl>\n"
|
||||
"Language-Team: \n"
|
||||
@ -18,14 +18,10 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: polyclinic_scheduling/settings.py:129
|
||||
#: polyclinic_scheduling/settings.py:130
|
||||
msgid "Dutch"
|
||||
msgstr "Nederlands"
|
||||
|
||||
#: polyclinic_scheduling/settings.py:130
|
||||
msgid "English"
|
||||
msgstr "Engels"
|
||||
|
||||
#: polyclinic_scheduling/urls.py:22 polyclinic_scheduling/urls.py:23
|
||||
msgid "University of Groningen Polyclinic planning tool"
|
||||
msgstr "RUG Poliklinieken planning tool"
|
||||
@ -33,3 +29,6 @@ msgstr "RUG Poliklinieken planning tool"
|
||||
#: polyclinic_scheduling/urls.py:24
|
||||
msgid "Polyclinic planning tool"
|
||||
msgstr "Poliklinieken planning tool"
|
||||
|
||||
#~ msgid "English"
|
||||
#~ msgstr "Engels"
|
||||
|
@ -61,6 +61,7 @@ MIDDLEWARE = [
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'apps.RUG_template.middleware.TimezoneMiddleware',
|
||||
'django.middleware.locale.LocaleMiddleware',
|
||||
]
|
||||
|
||||
@ -123,14 +124,14 @@ LOGOUT_REDIRECT_URL = '/'
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/3.0/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'en-us'
|
||||
LANGUAGE_CODE = 'nl'
|
||||
|
||||
LANGUAGES = [
|
||||
('nl', _('Dutch')),
|
||||
('en', _('English')),
|
||||
# ('en', _('English')),
|
||||
]
|
||||
|
||||
TIME_ZONE = 'UTC'
|
||||
TIME_ZONE = config('TIME_ZONE', default='UTC')
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
|
@ -2,4 +2,6 @@ Django==3.0.6
|
||||
jsonfield==3.1.0
|
||||
python-decouple==3.3
|
||||
dj-database-url==0.5.0
|
||||
mysqlclient==1.4.6
|
||||
mysqlclient==1.4.6
|
||||
django-ipware==2.1.0
|
||||
requests==2.23.0
|
Reference in New Issue
Block a user