From 5a1363cfbf696d91efb46881ff08a55e27915c6e Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Tue, 23 Jan 2018 17:24:56 +0100 Subject: [PATCH] Release v1.13 --- README.md | 1 + docs/application.rst | 9 + docs/changelog.rst | 13 + docs/donations.rst | 14 + docs/index.rst | 1 + docs/installation.rst | 120 +++- docs/locale/nl/LC_MESSAGES/application.mo | Bin 11431 -> 11954 bytes docs/locale/nl/LC_MESSAGES/application.po | 49 +- docs/locale/nl/LC_MESSAGES/changelog.po | 549 ++++++++++-------- docs/locale/nl/LC_MESSAGES/donations.mo | Bin 0 -> 1336 bytes docs/locale/nl/LC_MESSAGES/donations.po | 51 ++ docs/locale/nl/LC_MESSAGES/installation.mo | Bin 23612 -> 24503 bytes docs/locale/nl/LC_MESSAGES/installation.po | 265 +++++---- docs/locale/nl/LC_MESSAGES/retention.mo | Bin 4685 -> 4624 bytes docs/locale/nl/LC_MESSAGES/retention.po | 6 +- dsmr_api/tests/v1/test_api.py | 2 +- dsmr_api/urls/__init__.py | 7 - dsmr_api/urls/v1.py | 2 + dsmr_api/urls/v2.py | 2 + dsmr_backend/mixins.py | 5 + dsmr_backend/tests/mixins.py | 2 +- dsmr_backend/tests/test_backend.py | 8 +- .../tests/datalogger/test_error.py | 14 +- .../tests/datalogger/test_generic.py | 2 +- .../tests/datalogger/test_iskra.py | 2 +- .../tests/datalogger/test_kaifa_dsmr42.py | 2 +- .../datalogger/test_landisgyr350_dsmr40.py | 2 +- .../datalogger/test_landisgyr350_dsmr42.py | 2 +- .../test_landisgyr350_other_dsmr42.py | 2 +- .../middleware/exception_traceback.py | 14 + .../templates/dsmr_frontend/statistics.html | 8 + ..._dashboard_energysupplierprice_matching.py | 2 +- ...test_dashboard_reverse_dashboard_graphs.py | 2 +- .../test_renamed_docs_reverse_url.py | 2 +- .../tests/webinterface/test_archive.py | 2 +- .../tests/webinterface/test_compare.py | 2 +- .../tests/webinterface/test_dashboard.py | 2 +- .../tests/webinterface/test_export.py | 2 +- .../tests/webinterface/test_generic.py | 2 +- .../tests/webinterface/test_statistics.py | 7 +- .../tests/webinterface/test_status.py | 2 +- .../tests/webinterface/test_trends.py | 2 +- dsmr_frontend/urls.py | 2 + dsmr_frontend/views/export.py | 2 +- dsmr_frontend/views/statistics.py | 8 +- dsmr_stats/tests/models/test_notes.py | 2 +- dsmr_weather/services.py | 2 +- dsmrreader/__init__.py | 2 +- dsmrreader/config/base.py | 9 +- dsmrreader/config/development.py | 2 - dsmrreader/config/production.py | 7 + dsmrreader/config/test/base.py | 6 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 53826 -> 53911 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 3 + dsmrreader/provisioning/requirements/base.txt | 8 +- dsmrreader/provisioning/requirements/test.txt | 2 +- dsmrreader/urls.py | 7 +- 57 files changed, 789 insertions(+), 454 deletions(-) create mode 100644 docs/donations.rst create mode 100644 docs/locale/nl/LC_MESSAGES/donations.mo create mode 100644 docs/locale/nl/LC_MESSAGES/donations.po diff --git a/README.md b/README.md index 0da8f1e14..f7ad241dc 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Coverage](https://codecov.io/github/dennissiemensma/dsmr-reader/coverage.svg?branch=master)](https://codecov.io/gh/dennissiemensma/dsmr-reader/branch/master) [![Documentation Status](https://readthedocs.org/projects/dsmr-reader/badge/?version=latest)](https://dsmr-reader.readthedocs.io/en/latest/?badge=latest) [![Requirements Status](https://requires.io/github/dennissiemensma/dsmr-reader/requirements.svg?branch=master)](https://requires.io/github/dennissiemensma/dsmr-reader/requirements/?branch=master) +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://dsmr-reader.readthedocs.io/en/latest/donations.html) # DSMR Reader Datalogger/GUI diff --git a/docs/application.rst b/docs/application.rst index b1dccbb36..def6ef35a 100644 --- a/docs/application.rst +++ b/docs/application.rst @@ -69,6 +69,15 @@ Data preservation & backups Everything OK? Congratulations, this was the hardest part and now the fun begins by monitoring your energy consumption. +Optional: Setting up an USB drive for backups +--------------------------------------------- + +.. seealso:: + + For more information about (optionally) setting up an USB drive for backups, see `Data preservation/backups #268 `_. + + + Application updates (bug fixes & new features) ---------------------------------------------- diff --git a/docs/changelog.rst b/docs/changelog.rst index 47e4c3bf8..3cbb461b3 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -18,6 +18,19 @@ Please make sure you have a fresh **database backup** before upgrading! Upgradin +v1.13.0 - 2018-01-23 +^^^^^^^^^^^^^^^^^^^^ + +**Tickets resolved in this release:** + +- [`#203 `_] One-click installer +- [`#396 `_] Gecombineerd tarief tonen op 'Statistieken'-pagina +- [`#268 `_] Data preservation/backups - by WatskeBart +- [`#425 `_] Requests for donating a beer or coffee +- [`#427 `_] Reconnect to postgresql +- [`#394 `_] Django 2.0 + + v1.12.0 - 2018-01-14 ^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/donations.rst b/docs/donations.rst new file mode 100644 index 000000000..46d463d14 --- /dev/null +++ b/docs/donations.rst @@ -0,0 +1,14 @@ +Donations +========= + +Do you like this project and do you want to buy me a beer or coffee? You are always welcome to make a small donation as a token of appreciation! + + +`Donate using PayPal `_ +-------------------------------------------------------------- + +.. note:: + + Know that this project **will always be free to use** and I already do make a living with my regular job. + + Please do not pressure me by "donating for new features", but only for liking what you are using so far... Thanks! =) diff --git a/docs/index.rst b/docs/index.rst index 3713a5350..629179616 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -22,4 +22,5 @@ DSMR Reader's documentation changelog contributing credits + donations licence diff --git a/docs/installation.rst b/docs/installation.rst index 0d7ffa340..91207281e 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -24,8 +24,84 @@ Docker (alternative) Not interested in Docker? Follow the instructions in the chapters below if you wish to install this project the regular way. +Method A: Quick install +----------------------- +For advanced users. A summary of all commands listed under Method B. + +Start:: + + # Packages + sudo apt-get install -y postgresql postgresql-server-dev-all nginx supervisor git python3 python3-pip python3-virtualenv virtualenvwrapper + +.. note:: + + Does PostgreSQL not start/create the cluster due to locales? I.e.:: + + Error: The locale requested by the environment is invalid. + Error: could not create default cluster. Please create it manually with + + pg_createcluster 9.4 main --start + + + Try: ``dpkg-reconfigure locales``. + + Still no luck? Try editing ``/etc/environment``, add ``LC_ALL="en_US.utf-8"`` and reboot. + Then try ``pg_createcluster 9.4 main --start`` again (or whatever version you are using). + +Continue:: + + # Database + sudo sudo -u postgres createuser -DSR dsmrreader + sudo sudo -u postgres createdb -O dsmrreader dsmrreader + sudo sudo -u postgres psql -c "alter user dsmrreader with password 'dsmrreader';" + + # System user + sudo useradd dsmr --home-dir /home/dsmr --create-home --shell /bin/bash + sudo usermod -a -G dialout dsmr + + # Nginx + sudo mkdir -p /var/www/dsmrreader/static + sudo chown -R dsmr:dsmr /var/www/dsmrreader/ + + # Code checkout + sudo git clone https://github.com/dennissiemensma/dsmr-reader.git /home/dsmr/dsmr-reader + sudo chown -R dsmr:dsmr /home/dsmr/ + + # Virtual env + sudo sudo -u dsmr mkdir /home/dsmr/.virtualenvs + sudo sudo -u dsmr virtualenv /home/dsmr/.virtualenvs/dsmrreader --no-site-packages --python python3 + sudo sh -c 'echo "source ~/.virtualenvs/dsmrreader/bin/activate" >> /home/dsmr/.bashrc' + sudo sh -c 'echo "cd ~/dsmr-reader" >> /home/dsmr/.bashrc' + + # Config & requirements + sudo sudo -u dsmr cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/django/postgresql.py /home/dsmr/dsmr-reader/dsmrreader/settings.py + sudo sudo -u dsmr /home/dsmr/.virtualenvs/dsmrreader/bin/pip3 install -r /home/dsmr/dsmr-reader/dsmrreader/provisioning/requirements/base.txt -r /home/dsmr/dsmr-reader/dsmrreader/provisioning/requirements/postgresql.txt + + # Setup + sudo sudo -u dsmr /home/dsmr/.virtualenvs/dsmrreader/bin/python3 /home/dsmr/dsmr-reader/manage.py migrate + sudo sudo -u dsmr /home/dsmr/.virtualenvs/dsmrreader/bin/python3 /home/dsmr/dsmr-reader/manage.py collectstatic --noinput + + # Nginx + sudo rm /etc/nginx/sites-enabled/default + sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/nginx/dsmr-webinterface /etc/nginx/sites-enabled/ + sudo service nginx configtest + sudo service nginx reload + + # Supervisor + sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/supervisor/dsmr-reader.conf /etc/supervisor/conf.d/ + sudo supervisorctl reread + sudo supervisorctl update + + # Create application user + sudo sudo -u dsmr /home/dsmr/.virtualenvs/dsmrreader/bin/python3 /home/dsmr/dsmr-reader/manage.py createsuperuser --username admin --email root@localhost + + +Method B: Manually +------------------ +For others users who want some addition explaination about what they are exactly doing/installing. + 1. Database backend (PostgreSQL) --------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The application stores by default all readings taken from the serial cable. There is support for **PostgreSQL**, and there used to be support for **MySQL/MariaDB** as well. @@ -37,8 +113,20 @@ Install PostgreSQL, ``postgresql-server-dev-all`` is required for the virtualenv sudo apt-get install -y postgresql postgresql-server-dev-all -Does Postgres not start due to locales? Try: ``dpkg-reconfigure locales``. -Still no luck? Try editing ``/etc/environment``, add ``LC_ALL="en_US.utf-8"`` and reboot. +.. note:: + + Does PostgreSQL not start/create the cluster due to locales? I.e.:: + + Error: The locale requested by the environment is invalid. + Error: could not create default cluster. Please create it manually with + + pg_createcluster 9.4 main --start + + + Try: ``dpkg-reconfigure locales``. + + Still no luck? Try editing ``/etc/environment``, add ``LC_ALL="en_US.utf-8"`` and reboot. + Then try ``pg_createcluster 9.4 main --start`` again (or whatever version you are using). (!) Ignore any '*could not change directory to "/root": Permission denied*' errors for the following three commands. @@ -69,7 +157,7 @@ Still no luck? Try editing ``/etc/environment``, add ``LC_ALL="en_US.utf-8"`` an Now continue at chapter 2 below (Dependencies). (Legacy) MySQL/MariaDB -^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^ .. warning:: Support for the MySQL database backend is deprecated and will be removed in a later release. @@ -112,7 +200,7 @@ Install MariaDB. You can also choose to install the closed source MySQL, as they 2. Dependencies ---------------- +^^^^^^^^^^^^^^^ Now you'll have to install several utilities, required for the Nginx webserver, Gunicorn application server and cloning the application code from the Github repository:: sudo apt-get install -y nginx supervisor git python3 python3-pip python3-virtualenv virtualenvwrapper @@ -124,7 +212,7 @@ It's very basic but also very effective to simply test whether your serial cable 3. Application user -------------------- +^^^^^^^^^^^^^^^^^^^ The application runs as ``dsmr`` user by default. This way we do not have to run the application as ``root``, which is a bad practice anyway. Create user with homedir. The application code and virtualenv will reside in this directory as well:: @@ -139,7 +227,7 @@ Either proceed to the next heading **for a test reading** or continue at chapter Your first reading (optional) ------------------------------ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: @@ -163,7 +251,7 @@ You now should see something similar to ``Connected.`` and a wall of text and nu 4. Webserver/Nginx (part 1) ---------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^ *We will now prepare the webserver, Nginx. It will serve all application's static files directly and proxy any application requests to the backend, Gunicorn controlled by Supervisor, which we will configure later on.* @@ -177,7 +265,7 @@ Django will later copy all static files to the directory below, used by Nginx to 5. Clone project code from Github ---------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Now is the time to clone the code from the repository into the homedir we created. - Make sure you are now acting as ``dsmr`` user (if not then enter: ``sudo su - dsmr``) @@ -190,7 +278,7 @@ This may take a few seconds. When finished, you should see a new folder called ` 6. Virtualenv -------------- +^^^^^^^^^^^^^ The dependencies our application uses are stored in a separate environment, also called **VirtualEnv**. @@ -229,7 +317,7 @@ Make sure you've read and executed the note above, because you'll need it for th 7. Application configuration & setup ------------------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The application will also need the appropriate database client, which is not installed by default. For this I created two ready-to-use requirements files, which will also install all other dependencies required, such as the Django framework. @@ -240,7 +328,7 @@ The ``base.txt`` contains requirements which the application needs anyway, no ma **Installation of the requirements below might take a while**, depending on your Internet connection, RaspberryPi speed and resources (generally CPU) available. Nothing to worry about. :] PostgreSQL -^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^ - Did you choose PostgreSQL? Then execute these two lines:: cp dsmrreader/provisioning/django/postgresql.py dsmrreader/settings.py @@ -254,7 +342,7 @@ make sure you've installed ``postgresql-server-dev-all`` earlier in the process, Continue to chapter 8 (Bootstrapping). (Legacy) MySQL/MariaDB -^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^ .. warning:: Support for the MySQL database backend is deprecated and will be removed in a later release. @@ -271,7 +359,7 @@ make sure you've installed ``libmysqlclient-dev`` earlier in the process, when y 8. Bootstrapping ----------------- +^^^^^^^^^^^^^^^^ Now it's time to bootstrap the application and check whether all settings are good and requirements are met. - Execute this to initialize the database we've created earlier:: @@ -302,7 +390,7 @@ You've almost completed the installation now. 9. Webserver/Nginx (part 2) ---------------------------- +^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: @@ -329,7 +417,7 @@ Remove the default Nginx vhost (**only when you do not use it yourself, see the 10. Supervisor --------------- +^^^^^^^^^^^^^^ Now we configure `Supervisor `_, which is used to run our application's web interface and background jobs used. It's also configured to bring the entire application up again after a shutdown or reboot. diff --git a/docs/locale/nl/LC_MESSAGES/application.mo b/docs/locale/nl/LC_MESSAGES/application.mo index cd7134ea321a82f8b7920cfd19044173f107a279..6fc3ebe2f55191b3c81418e854ba57eb9fdb6347 100644 GIT binary patch delta 1480 zcmb8uZ-^CD7{~Fa_U^8?)mk;Znwn=@ZFhC=&MLbqcU#f476a3?M8S0DdXKw<_s(4B z&xWqB_(GJ3l$IqZMUg-WQtOhnzKD{bqFzK12~jU1p@K*heI@Gm%-jfHh>$9VJ+5mVuY29a&} zCmzDSi6V#bdpwQ(lSGzc`qAWhD=|y|3+%>!(Y$#6VFH>M^De)u@W(f*w z4DK>tK657V;EUMEg&Rit_2k%vGmtT|7I~Hw@N?XQKVgn}dlMVyi0s7Ucn<5HY)ckXE3P1s9Dd35;RPb= zaK%EV36J1Jt{-V989c^>gD?|u<91;-g&B$41ols`5s0uHXr_D`1qnsV4AZH$IyBSJ z#K!xD+Tzwwm3IqC%e>J!H5uEi1Y#0aYy8bb7*7_&EzO?XMa4a`tIFz){}(gC=KnLf z)v}q!I*1z!M4B_ zXITSII2c*^jvZdfDrnbrg22%w?FJ>=Dg-4z>ubB9eT(yv4lKql@84dzUVpPTyRKST zPHnt@S(Pi3I?}0}a*LzWGQA7d7bD*;X8G)m2TsYEfIy=u4U1 zHQgPHDnDczYDYGCCMm7`|C7?nEB%*}*2OlZbsSALi6+!)KZJ}PYVI@J)MFc@!m}q1$sTLG6FKSSOfiRMY zie~@sMl>%fq8Ev}k}x7F2%?K3y$B-eW=TX*7xg{wGykaUeU} z=)NQ(LR(EcSRr-e?M3_%S6xykUc)>13}-OymKt!cN9w>Nn*L>6g%kJ~r?G&iE184Q zDybI>m^Hs2T#PV~_DUb{Gfv_QpJaA6S}h$wt412bG@eJ*@)Ed!UATF%v!F&WPJa%~ zi^6r%e$1fR*jr=?eaC*Yg^GGRpg zW-pOm(J$dgoLWk@@D`J^JfB)F#pr)!ks^jH$!~7FG#3oat|&iHLY`IIN{KbpjZ@fz zZ?J*SIESC`FrJ`pH*p3BaI{%^jqmX}-fNL=U}lYU3avmnv*Vb(&OkIMUBM@~3kO@J z92Rj0wy&K}Ee_G2!!Y)?Nn}|WJc4I1j^A)QMncjTJc@U*Z(TWq9ww7KHHXRnHZsu3 zz%&D?^`sT!oW?(x!&>g=qGSRuZlGL@o5?14T$E8%zzHw^B-1&_W@8J%ew;AnTL{jh z>cy9k73XW%oD=47nBd*cfoaWebu}eSL4q_+qnV@tjY9tmA6MjC8gkoDy}vwmsjl6Zk65w%n3eKx?1)wGP7EiHCz6M@1cr~H7;FRde6~ diff --git a/docs/locale/nl/LC_MESSAGES/application.po b/docs/locale/nl/LC_MESSAGES/application.po index 901ea0093..c878a6c5e 100644 --- a/docs/locale/nl/LC_MESSAGES/application.po +++ b/docs/locale/nl/LC_MESSAGES/application.po @@ -3,12 +3,13 @@ msgstr "" "Project-Id-Version: DSMR Reader v1.x\n" "Report-Msgid-Bugs-To: Dennis Siemensma \n" "Last-Translator: Dennis Siemensma \n" +"Language: nl\n" "Language-Team: Dennis Siemensma \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.3.4\n" -"Language: nl\n" +"Generated-By: Babel 2.5.1\n" "X-Generator: Poedit 1.8.7.1\n" #: ../../application.rst:2 @@ -201,18 +202,32 @@ msgstr "" "eindelijk gebruikmaken van de applicatie en je energieverbruik meten." #: ../../application.rst:73 +msgid "Optional: Setting up an USB drive for backups" +msgstr "Optioneel: Een USB-drive gebruiken voor backup's" + +#: ../../application.rst:77 +msgid "" +"For more information about (optionally) setting up an USB drive for backups, " +"see `Data preservation/backups #268 `_." +msgstr "" +"Voor meer informatie om (optioneel) een USB-drive te gebruiken voor backup's, " +"zie `Data preservation/backups #268 `_." + +#: ../../application.rst:82 msgid "Application updates (bug fixes & new features)" msgstr "Applicatie updates (bugfixes & nieuwe mogelijkheden)" -#: ../../application.rst:77 +#: ../../application.rst:86 msgid ":doc:`This information can be found here`." msgstr ":doc:`Deze informatie kun je hier terugvinden`." -#: ../../application.rst:81 +#: ../../application.rst:90 msgid "Public webinterface warning" msgstr "Waarschuwing voor publiekelijke toegang" -#: ../../application.rst:85 +#: ../../application.rst:94 msgid "" "If you expose your application to the outside world or a public network, you " "might want to take additional steps:" @@ -220,7 +235,7 @@ msgstr "" "Wanneer je de applicatie koppelt aan het Internet wil je sowieso extra " "maatregelen nemen:" -#: ../../application.rst:87 +#: ../../application.rst:96 msgid "" "Please make sure to **alter** the ``SECRET_KEY`` setting in your ``dsmrreader/" "settings.py``." @@ -228,7 +243,7 @@ msgstr "" "Zorg ervoor dat je de instelling ``SECRET_KEY`` wijzigt in het bestand " "``dsmrreader/settings.py``." -#: ../../application.rst:89 +#: ../../application.rst:98 msgid "" "Don't forget to run ``./post-deploy.sh`` in the project's root, which will " "force the application to gracefully reload itself and apply the new settings " @@ -238,7 +253,7 @@ msgstr "" "hoogste map van project), die ervoor zorgt dat de hele applicatie zichzelf " "herlaadt en daarmee de nieuwe instellingen per direct gebruikt." -#: ../../application.rst:91 +#: ../../application.rst:100 msgid "" "Install a firewall, such as ``ufw`` `UncomplicatedFirewall `_ and restrict traffic to port ``22`` (only for " @@ -248,7 +263,7 @@ msgstr "" "ubuntu.com/UncomplicatedFirewall>`_) and beperk al het toegestane verkeer tot " "poort ``22`` (puur voor jezelf) en poort ``80``." -#: ../../application.rst:93 +#: ../../application.rst:102 msgid "" "You should also have Nginx restrict application access when exposing it to the " "Internet. Simply generate an htpasswd string `using one of the many generators " @@ -259,11 +274,11 @@ msgstr "" "tekenreeks via `een van de vele websites die dit voor je kunnen doen `_." -#: ../../application.rst:95 +#: ../../application.rst:104 msgid "Paste the htpasswd string in ``/etc/nginx/htpasswd``." msgstr "Plak de htpasswd-tekenreeks in het bestand ``/etc/nginx/htpasswd``." -#: ../../application.rst:99 +#: ../../application.rst:108 msgid "" "It's safe to a htpasswd generator, **just make sure to NEVER enter personal " "credentials** there **used for other applications or personal accounts**." @@ -272,7 +287,7 @@ msgstr "" "persoonlijke informatie of gegevens invoert die je ook op andere websites " "gebruikt**!" -#: ../../application.rst:103 +#: ../../application.rst:112 msgid "" "Alternatively you can generate a ``htpasswd`` file locally, by installing " "``sudo apt-get install apache2-utils`` and running ``sudo htpasswd -c /etc/" @@ -283,11 +298,11 @@ msgstr "" "``sudo htpasswd -c /etc/nginx/htpasswd USERNAME`` uit te voeren (waarbij " "``USERNAME`` je gewenste gebruikersnaam is)." -#: ../../application.rst:105 +#: ../../application.rst:114 msgid "The command will prompt you to enter a password for it." msgstr "Het command vraagt vervolgens om een wachtwoord voor het account." -#: ../../application.rst:108 +#: ../../application.rst:117 msgid "" "Open the site's vhost in ``/etc/nginx/sites-enabled/dsmr-webinterface`` and " "**uncomment** the following lines (remove the ##)::" @@ -295,15 +310,15 @@ msgstr "" "Open de website's vhost in ``/etc/nginx/sites-enabled/dsmr-webinterface`` en " "schakel de volgende regels in (verwijder de ## tekens)::" -#: ../../application.rst:113 +#: ../../application.rst:122 msgid "Now make sure you didn't insert any typo's by running::" msgstr "Zorg ervoor dat je geen typefouten hebt gemaakt door te controleren met::" -#: ../../application.rst:117 +#: ../../application.rst:126 msgid "And reload with::" msgstr "En herlaad met::" -#: ../../application.rst:121 +#: ../../application.rst:130 msgid "" "You should be prompted for login credentials the next time your browser " "accesses the application. For more information regarding this topic, see the " diff --git a/docs/locale/nl/LC_MESSAGES/changelog.po b/docs/locale/nl/LC_MESSAGES/changelog.po index 15fd3d1e0..e0d1405b0 100644 --- a/docs/locale/nl/LC_MESSAGES/changelog.po +++ b/docs/locale/nl/LC_MESSAGES/changelog.po @@ -53,25 +53,59 @@ msgstr "" "fixes-new-features>`_." #: ../../changelog.rst:22 -msgid "v1.12.0 - 2018-xx-xx" -msgstr "" - -#: ../../changelog.rst:24 ../../changelog.rst:41 ../../changelog.rst:62 -#: ../../changelog.rst:81 ../../changelog.rst:107 ../../changelog.rst:116 -#: ../../changelog.rst:125 ../../changelog.rst:148 ../../changelog.rst:157 -#: ../../changelog.rst:167 ../../changelog.rst:189 ../../changelog.rst:207 -#: ../../changelog.rst:216 ../../changelog.rst:226 ../../changelog.rst:235 -#: ../../changelog.rst:245 ../../changelog.rst:254 ../../changelog.rst:272 -#: ../../changelog.rst:291 ../../changelog.rst:316 ../../changelog.rst:329 -#: ../../changelog.rst:344 ../../changelog.rst:352 ../../changelog.rst:363 -#: ../../changelog.rst:375 ../../changelog.rst:392 ../../changelog.rst:400 -#: ../../changelog.rst:408 ../../changelog.rst:422 +msgid "v1.13.0 - 2018-xx-xx" +msgstr "" + +#: ../../changelog.rst:24 ../../changelog.rst:35 ../../changelog.rst:52 +#: ../../changelog.rst:73 ../../changelog.rst:92 ../../changelog.rst:118 +#: ../../changelog.rst:127 ../../changelog.rst:136 ../../changelog.rst:159 +#: ../../changelog.rst:168 ../../changelog.rst:178 ../../changelog.rst:200 +#: ../../changelog.rst:218 ../../changelog.rst:227 ../../changelog.rst:237 +#: ../../changelog.rst:246 ../../changelog.rst:256 ../../changelog.rst:265 +#: ../../changelog.rst:283 ../../changelog.rst:302 ../../changelog.rst:327 +#: ../../changelog.rst:340 ../../changelog.rst:355 ../../changelog.rst:363 +#: ../../changelog.rst:374 ../../changelog.rst:386 ../../changelog.rst:403 +#: ../../changelog.rst:411 ../../changelog.rst:419 ../../changelog.rst:433 msgid "**Tickets resolved in this release:**" msgstr "**Tickets die opgelost zijn in deze release:**" #: ../../changelog.rst:26 #, fuzzy msgid "" +"[`#203 `_] " +"One-click installer" +msgstr "" +"De ondersteuning voor ``Python 3.3`` is **vervallen** wegens de Django " +"upgrade (`#103 `_)." + +#: ../../changelog.rst:27 +#, fuzzy +msgid "" +"[`#396 `_] " +"Gecombineerd tarief tonen op 'Statistieken'-pagina" +msgstr "" +"De ondersteuning voor ``Python 3.3`` is **vervallen** wegens de Django " +"upgrade (`#103 `_)." + +#: ../../changelog.rst:28 +#, fuzzy +msgid "" +"[`#268 `_] " +"Data preservation/backups - by WatskeBart" +msgstr "" +"De ondersteuning voor ``Python 3.3`` is **vervallen** wegens de Django " +"upgrade (`#103 `_)." + +#: ../../changelog.rst:33 +msgid "v1.12.0 - 2018-01-14" +msgstr "" + +#: ../../changelog.rst:37 +#, fuzzy +msgid "" "[`#72 `_] " "Source data retention" msgstr "" @@ -79,7 +113,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:27 +#: ../../changelog.rst:38 #, fuzzy msgid "" "[`#414 `_] add" @@ -89,7 +123,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:28 +#: ../../changelog.rst:39 #, fuzzy msgid "" "[`#405 `_] " @@ -99,7 +133,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:29 +#: ../../changelog.rst:40 #, fuzzy msgid "" "[`#404 `_] Fix" @@ -109,7 +143,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:30 +#: ../../changelog.rst:41 #, fuzzy msgid "" "[`#398 `_] iOS" @@ -120,7 +154,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:31 +#: ../../changelog.rst:42 #, fuzzy msgid "" "[`#399 `_] " @@ -130,7 +164,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:32 +#: ../../changelog.rst:43 #, fuzzy msgid "" "[`#406 `_] " @@ -140,7 +174,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:33 +#: ../../changelog.rst:44 #, fuzzy msgid "" "[`#413 `_] " @@ -150,7 +184,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:34 +#: ../../changelog.rst:45 #, fuzzy msgid "" "[`#419 `_] " @@ -160,11 +194,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:39 +#: ../../changelog.rst:50 msgid "v1.11.0 - 2017-11-24" msgstr "" -#: ../../changelog.rst:43 +#: ../../changelog.rst:54 #, fuzzy msgid "" "[`#382 `_] " @@ -174,7 +208,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:44 +#: ../../changelog.rst:55 #, fuzzy msgid "" "[`#385 `_] " @@ -184,7 +218,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:45 +#: ../../changelog.rst:56 #, fuzzy msgid "" "[`#387 `_] " @@ -194,7 +228,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:46 +#: ../../changelog.rst:57 #, fuzzy msgid "" "[`#368 `_] " @@ -204,7 +238,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:47 +#: ../../changelog.rst:58 #, fuzzy msgid "" "[`#370 `_] " @@ -214,7 +248,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:48 +#: ../../changelog.rst:59 #, fuzzy msgid "" "[`#371 `_] " @@ -224,7 +258,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:49 +#: ../../changelog.rst:60 #, fuzzy msgid "" "[`#378 `_] " @@ -234,18 +268,18 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:54 +#: ../../changelog.rst:65 msgid "v1.10.0 - 2017-10-19" msgstr "" -#: ../../changelog.rst:58 +#: ../../changelog.rst:69 msgid "" "This releases turns telegram logging **off by default**. If you wish to " "continue using this feature, add ``DSMRREADER_LOG_TELEGRAMS = True`` to " "your ``settings.py`` and reload the application." msgstr "" -#: ../../changelog.rst:64 +#: ../../changelog.rst:75 #, fuzzy msgid "" "[`#363 `_] " @@ -255,7 +289,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:65 +#: ../../changelog.rst:76 #, fuzzy msgid "" "[`#305 `_] " @@ -265,7 +299,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:66 +#: ../../changelog.rst:77 #, fuzzy msgid "" "[`#194 `_] Add" @@ -275,7 +309,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:67 +#: ../../changelog.rst:78 #, fuzzy msgid "" "[`#365 `_] " @@ -285,7 +319,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:68 +#: ../../changelog.rst:79 #, fuzzy msgid "" "[`#366 `_] " @@ -295,11 +329,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:73 +#: ../../changelog.rst:84 msgid "v1.9.0 - 2017-10-08" msgstr "" -#: ../../changelog.rst:77 +#: ../../changelog.rst:88 msgid "" "This release contains an update for the API framework, which `has a fix " "for some timezone issues `_] Data " @@ -317,7 +351,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:84 +#: ../../changelog.rst:95 #, fuzzy msgid "" "[`#163 `_] " @@ -327,7 +361,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:85 +#: ../../changelog.rst:96 #, fuzzy msgid "" "[`#337 `_] API" @@ -337,7 +371,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:86 +#: ../../changelog.rst:97 #, fuzzy msgid "" "[`#284 `_] " @@ -347,7 +381,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:87 +#: ../../changelog.rst:98 #, fuzzy msgid "" "[`#279 `_] " @@ -358,7 +392,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:88 +#: ../../changelog.rst:99 #, fuzzy msgid "" "[`#245 `_] " @@ -368,7 +402,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:89 +#: ../../changelog.rst:100 #, fuzzy msgid "" "[`#272 `_] " @@ -378,7 +412,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:90 +#: ../../changelog.rst:101 #, fuzzy msgid "" "[`#273 `_] " @@ -388,7 +422,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:91 +#: ../../changelog.rst:102 #, fuzzy msgid "" "[`#286 `_] Na " @@ -399,7 +433,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:92 +#: ../../changelog.rst:103 #, fuzzy msgid "" "[`#332 `_] " @@ -409,7 +443,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:93 +#: ../../changelog.rst:104 #, fuzzy msgid "" "[`#276 `_] " @@ -419,7 +453,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:94 +#: ../../changelog.rst:105 #, fuzzy msgid "" "[`#288 `_] Add" @@ -429,7 +463,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:95 +#: ../../changelog.rst:106 #, fuzzy msgid "" "[`#320 `_] " @@ -439,7 +473,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:96 +#: ../../changelog.rst:107 #, fuzzy msgid "" "[`#314 `_] Add" @@ -449,7 +483,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:97 +#: ../../changelog.rst:108 #, fuzzy msgid "" "[`#358 `_] " @@ -459,7 +493,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:98 +#: ../../changelog.rst:109 #, fuzzy msgid "" "[`#270 `_] " @@ -469,7 +503,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:99 +#: ../../changelog.rst:110 #, fuzzy msgid "" "[`#231 `_] " @@ -479,7 +513,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:100 +#: ../../changelog.rst:111 #, fuzzy msgid "" "[`#300 `_] " @@ -489,11 +523,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:105 +#: ../../changelog.rst:116 msgid "v1.8.2 - 2017-08-12" msgstr "" -#: ../../changelog.rst:109 +#: ../../changelog.rst:120 #, fuzzy msgid "" "[`#346 `_] " @@ -503,11 +537,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:114 +#: ../../changelog.rst:125 msgid "v1.8.1 - 2017-07-04" msgstr "" -#: ../../changelog.rst:118 +#: ../../changelog.rst:129 #, fuzzy msgid "" "[`#339 `_] " @@ -517,11 +551,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:123 +#: ../../changelog.rst:134 msgid "v1.8.0 - 2017-06-14" msgstr "" -#: ../../changelog.rst:127 +#: ../../changelog.rst:138 #, fuzzy msgid "" "[`#141 `_] Add" @@ -531,7 +565,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:128 +#: ../../changelog.rst:139 #, fuzzy msgid "" "[`#331 `_] " @@ -541,7 +575,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:129 +#: ../../changelog.rst:140 #, fuzzy msgid "" "[`#299 `_] " @@ -551,31 +585,31 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:134 +#: ../../changelog.rst:145 msgid "v1.7.0 - 2017-05-04" msgstr "" -#: ../../changelog.rst:138 +#: ../../changelog.rst:149 msgid "" "Please note that the ``dsmr_datalogger.0007_dsmrreading_timestamp_index``" " migration **will take quite some time**, as it adds an index on one of " "the largest database tables!" msgstr "" -#: ../../changelog.rst:140 +#: ../../changelog.rst:151 msgid "" "It takes **around two minutes** on a RaspberryPi 2 & 3 with ``> 4.3 " "million`` readings on PostgreSQL. Results may differ on **slower " "RaspberryPi's** or **with MySQL**." msgstr "" -#: ../../changelog.rst:145 +#: ../../changelog.rst:156 msgid "" "The API-docs for the new v2 API `can be found here `_." msgstr "" -#: ../../changelog.rst:150 +#: ../../changelog.rst:161 #, fuzzy msgid "" "[`#230 `_] " @@ -585,11 +619,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:155 +#: ../../changelog.rst:166 msgid "v1.6.2 - 2017-04-23" msgstr "" -#: ../../changelog.rst:159 +#: ../../changelog.rst:170 #, fuzzy msgid "" "[`#269 `_] " @@ -599,7 +633,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:160 +#: ../../changelog.rst:171 #, fuzzy msgid "" "[`#303 `_] " @@ -609,11 +643,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:165 +#: ../../changelog.rst:176 msgid "v1.6.1 - 2017-04-06" msgstr "" -#: ../../changelog.rst:169 +#: ../../changelog.rst:180 #, fuzzy msgid "" "[`#298 `_] " @@ -623,11 +657,11 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:174 +#: ../../changelog.rst:185 msgid "v1.6.0 - 2017-03-18" msgstr "" -#: ../../changelog.rst:178 +#: ../../changelog.rst:189 msgid "" "Support for ``MySQL`` has been **deprecated** since ``DSMR-reader v1.6`` " "and will be discontinued completely in a later release. Please use a " @@ -635,14 +669,14 @@ msgid "" "supported in easily migrating to PostgreSQL in the future." msgstr "" -#: ../../changelog.rst:183 +#: ../../changelog.rst:194 msgid "" "**Change in API:** The telegram creation API now returns an ``HTTP 201`` " "response when successful. An ``HTTP 200`` was returned in former " "versions. :doc:`View API docs`." msgstr "" -#: ../../changelog.rst:191 +#: ../../changelog.rst:202 #, fuzzy msgid "" "[`#221 `_] " @@ -652,7 +686,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:192 +#: ../../changelog.rst:203 #, fuzzy msgid "" "[`#237 `_] " @@ -662,7 +696,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:193 +#: ../../changelog.rst:204 #, fuzzy msgid "" "[`#249 `_] " @@ -672,7 +706,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:194 +#: ../../changelog.rst:205 #, fuzzy msgid "" "[`#232 `_] " @@ -682,19 +716,19 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:195 +#: ../../changelog.rst:206 msgid "" "[`#260 `_] Add" " link to readthedocs in Django for Dropbox instructions." msgstr "" -#: ../../changelog.rst:196 +#: ../../changelog.rst:207 msgid "" "[`#211 `_] API" " request should return HTTP 201 instead of HTTP 200." msgstr "" -#: ../../changelog.rst:197 +#: ../../changelog.rst:208 #, fuzzy msgid "" "[`#191 `_] " @@ -704,7 +738,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:198 +#: ../../changelog.rst:209 #, fuzzy msgid "" "[`#251 `_] " @@ -714,7 +748,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:199 +#: ../../changelog.rst:210 #, fuzzy msgid "" "[`#257 `_] " @@ -724,7 +758,7 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:200 +#: ../../changelog.rst:211 #, fuzzy msgid "" "[`#274 `_] " @@ -734,81 +768,81 @@ msgstr "" "upgrade (`#103 `_)." -#: ../../changelog.rst:205 ../../changelog.rst:224 +#: ../../changelog.rst:216 ../../changelog.rst:235 msgid "v1.5.5 - 2017-01-19" msgstr "" -#: ../../changelog.rst:209 ../../changelog.rst:228 +#: ../../changelog.rst:220 ../../changelog.rst:239 msgid "" "Remove readonly restriction for editing statistics in admin interface " "(`#242 `_)." msgstr "" -#: ../../changelog.rst:214 ../../changelog.rst:233 +#: ../../changelog.rst:225 ../../changelog.rst:244 msgid "v1.5.4 - 2017-01-12" msgstr "" -#: ../../changelog.rst:218 ../../changelog.rst:237 +#: ../../changelog.rst:229 ../../changelog.rst:248 msgid "" "Improve datalogger for DSMR v5.0 (`#212 " "`_)." msgstr "" -#: ../../changelog.rst:219 ../../changelog.rst:238 +#: ../../changelog.rst:230 ../../changelog.rst:249 msgid "" "Fixed another bug in MinderGas API client implementation (`#228 " "`_)." msgstr "" -#: ../../changelog.rst:243 +#: ../../changelog.rst:254 msgid "v1.5.3 - 2017-01-11" msgstr "" -#: ../../changelog.rst:247 +#: ../../changelog.rst:258 msgid "" "Improve MinderGas API client implementation (`#228 " "`_)." msgstr "" -#: ../../changelog.rst:252 +#: ../../changelog.rst:263 msgid "v1.5.2 - 2017-01-09" msgstr "" -#: ../../changelog.rst:256 +#: ../../changelog.rst:267 msgid "" "Automatic refresh of dashboard charts (`#210 " "`_)." msgstr "" -#: ../../changelog.rst:257 +#: ../../changelog.rst:268 msgid "" "Mindergas.nl API: Tijdstip van verzending willekeurig maken (`#204 " "`_)." msgstr "" -#: ../../changelog.rst:258 +#: ../../changelog.rst:269 msgid "" "Extend API docs with additional example (`#185 " "`_)." msgstr "" -#: ../../changelog.rst:259 +#: ../../changelog.rst:270 msgid "" "Docs: How to restore backup (`#190 `_)." msgstr "" -#: ../../changelog.rst:260 +#: ../../changelog.rst:271 msgid "" "Log errors occured to file (`#181 `_)." msgstr "" -#: ../../changelog.rst:265 +#: ../../changelog.rst:276 msgid "v1.5.1 - 2017-01-04" msgstr "" -#: ../../changelog.rst:269 +#: ../../changelog.rst:280 msgid "" "This patch contains no new features and **only solves upgrading issues** " "for some users." @@ -816,7 +850,7 @@ msgstr "" "Deze patch bevat geen nieuwe features en **lost alleen upgrade-problemen " "op** voor sommige gebruikers." -#: ../../changelog.rst:274 +#: ../../changelog.rst:285 msgid "" "Fix for issues `#200 `_ & `#217 `_)." -#: ../../changelog.rst:284 +#: ../../changelog.rst:295 msgid "" "There is **experimental support** for ``Python 3.6`` and ``Python 3.7 " "(nightly)`` as the unittests are `now built against those versions `_ (`#167 `_)." -#: ../../changelog.rst:286 +#: ../../changelog.rst:297 msgid "**Legacy warning**" msgstr "**Waarschuwing voor legacy**" -#: ../../changelog.rst:288 +#: ../../changelog.rst:299 msgid "" "The migrations that were squashed together in (`#31 " "`_) have been " @@ -878,7 +912,7 @@ msgstr "" "**verwijderd**. Hier heb je alleen maar te maken wanneer je nog gebruik " "maakt van een dsmrreader-versie **vóór** ``v0.13 (β)``." -#: ../../changelog.rst:289 +#: ../../changelog.rst:300 msgid "" "If you are indeed still running ``< v0.13 (β)``, please upgrade to " "``v1.4`` first (!), followed by an upgrade to ``v1.5``." @@ -886,409 +920,409 @@ msgstr "" "Wanneer je nog steeds een versie van vóór ``< v0.13 (β)`` draait, upgrade" " dan eerst naar ``v1.4`` (!), gevolgd door een upgrade naar ``v1.5``." -#: ../../changelog.rst:293 +#: ../../changelog.rst:304 msgid "" "Verify telegrams' CRC (`#188 `_)." msgstr "" -#: ../../changelog.rst:294 +#: ../../changelog.rst:305 msgid "" "Display last 24 hours on dashboard (`#164 " "`_)." msgstr "" -#: ../../changelog.rst:295 +#: ../../changelog.rst:306 msgid "" "Status page visualisation (`#172 `_)." msgstr "" -#: ../../changelog.rst:296 +#: ../../changelog.rst:307 msgid "" "Store and display phases consumption (`#161 " "`_)." msgstr "" -#: ../../changelog.rst:297 +#: ../../changelog.rst:308 msgid "" "Weather graph not showing when no gas data is available (`#170 " "`_)." msgstr "" -#: ../../changelog.rst:298 +#: ../../changelog.rst:309 msgid "" "Upgrade to ChartJs 2.0 (`#127 `_)." msgstr "" -#: ../../changelog.rst:299 +#: ../../changelog.rst:310 msgid "" "Improve Statistics page performance (`#173 " "`_)." msgstr "" -#: ../../changelog.rst:300 +#: ../../changelog.rst:311 msgid "" "Version checker at github (`#166 `_)." msgstr "" -#: ../../changelog.rst:301 +#: ../../changelog.rst:312 msgid "" "Remove required login for dismissal of in-app notifications (`#179 " "`_)." msgstr "" -#: ../../changelog.rst:302 +#: ../../changelog.rst:313 msgid "" "Round numbers displayed in GUI to 2 decimals (`#183 " "`_)." msgstr "" -#: ../../changelog.rst:303 +#: ../../changelog.rst:314 msgid "" "Switch Nosetests to Pytest (+ pytest-cov) (`#167 " "`_)." msgstr "" -#: ../../changelog.rst:304 +#: ../../changelog.rst:315 msgid "" "PyLama code audit (+ pytest-cov) (`#158 " "`_)." msgstr "" -#: ../../changelog.rst:305 +#: ../../changelog.rst:316 msgid "" "Double upgrade of Django framework ``Django 1.8`` -> ``Django 1.9`` -> " "``Django 1.10`` (`#103 `_)." msgstr "" -#: ../../changelog.rst:306 +#: ../../changelog.rst:317 msgid "" "Force ``PYTHONUNBUFFERED`` for supervisor commands (`#176 " "`_)." msgstr "" -#: ../../changelog.rst:307 +#: ../../changelog.rst:318 msgid "" "Documentation updates for v1.5 (`#171 `_)." msgstr "" -#: ../../changelog.rst:308 +#: ../../changelog.rst:319 msgid "" "Requirements update for v1.5 (december 2016) (`#182 " "`_)." msgstr "" -#: ../../changelog.rst:309 +#: ../../changelog.rst:320 msgid "" "Improved backend process logging (`#184 " "`_)." msgstr "" -#: ../../changelog.rst:314 +#: ../../changelog.rst:325 msgid "v1.4.1 - 2016-12-12" msgstr "" -#: ../../changelog.rst:318 +#: ../../changelog.rst:329 msgid "" "Consumption chart hangs due to unique_key violation (`#174 " "`_)." msgstr "" -#: ../../changelog.rst:319 +#: ../../changelog.rst:330 msgid "" "NoReverseMatch at / Reverse for 'docs' (`#175 " "`_)." msgstr "" -#: ../../changelog.rst:324 +#: ../../changelog.rst:335 msgid "v1.4.0 - 2016-11-28" msgstr "" -#: ../../changelog.rst:327 +#: ../../changelog.rst:338 msgid "" "Support for ``Python 3.5`` has been added officially (`#55 " "`_)." msgstr "" -#: ../../changelog.rst:331 +#: ../../changelog.rst:342 msgid "" "Push notifications for Notify My Android / Prowl (iOS), written by Jeroen" " Peters (`#152 `_)." msgstr "" -#: ../../changelog.rst:332 +#: ../../changelog.rst:343 msgid "" "Support for both single and high/low tariff (`#130 " "`_)." msgstr "" -#: ../../changelog.rst:333 +#: ../../changelog.rst:344 msgid "" "Add new note from Dashboard has wrong time format (`#159 " "`_)." msgstr "" -#: ../../changelog.rst:334 +#: ../../changelog.rst:345 msgid "" "Display estimated price for current usage in Dashboard (`#155 " "`_)." msgstr "" -#: ../../changelog.rst:335 +#: ../../changelog.rst:346 msgid "" "Dropbox API v1 deprecated in June 2017 (`#142 " "`_)." msgstr "" -#: ../../changelog.rst:336 +#: ../../changelog.rst:347 msgid "" "Improve code coverage (`#151 `_)." msgstr "" -#: ../../changelog.rst:337 +#: ../../changelog.rst:348 msgid "" "Restyle configuration overview (`#156 `_)." msgstr "" -#: ../../changelog.rst:338 +#: ../../changelog.rst:349 msgid "" "Capability based push notifications (`#165 " "`_)." msgstr "" -#: ../../changelog.rst:343 +#: ../../changelog.rst:354 msgid "v1.3.2 - 2016-11-08" msgstr "" -#: ../../changelog.rst:346 +#: ../../changelog.rst:357 msgid "" "Requirements update (november 2016) (`#150 " "`_)." msgstr "" -#: ../../changelog.rst:351 +#: ../../changelog.rst:362 msgid "v1.3.1 - 2016-08-16" msgstr "" -#: ../../changelog.rst:354 +#: ../../changelog.rst:365 msgid "" "CSS large margin-bottom (`#144 `_)." msgstr "" -#: ../../changelog.rst:355 +#: ../../changelog.rst:366 msgid "" "Django security releases issued: 1.8.14 (`#147 " "`_)." msgstr "" -#: ../../changelog.rst:356 +#: ../../changelog.rst:367 msgid "" "Requirements update (August 2016) (`#148 " "`_)." msgstr "" -#: ../../changelog.rst:357 +#: ../../changelog.rst:368 msgid "" "Query performance improvements (`#149 `_)." msgstr "" -#: ../../changelog.rst:362 +#: ../../changelog.rst:373 msgid "v1.3.0 - 2016-07-15" msgstr "" -#: ../../changelog.rst:365 +#: ../../changelog.rst:376 msgid "" "API endpoint for datalogger (`#140 `_)." msgstr "" -#: ../../changelog.rst:366 +#: ../../changelog.rst:377 msgid "" "Colors for charts (`#137 `_)." msgstr "" -#: ../../changelog.rst:367 +#: ../../changelog.rst:378 msgid "" "Data export: Mindergas.nl (`#10 `_)." msgstr "" -#: ../../changelog.rst:368 +#: ../../changelog.rst:379 msgid "" "Requirement upgrade (`#143 `_)." msgstr "" -#: ../../changelog.rst:369 +#: ../../changelog.rst:380 msgid "" "Installation wizard for first time use (`#139 " "`_)." msgstr "" -#: ../../changelog.rst:374 +#: ../../changelog.rst:385 msgid "v1.2.0 - 2016-05-18" msgstr "" -#: ../../changelog.rst:377 +#: ../../changelog.rst:388 msgid "" "Energy supplier prices does not indicate tariff type (Django admin) " "(`#126 `_)." msgstr "" -#: ../../changelog.rst:378 +#: ../../changelog.rst:389 msgid "" "Requirements update (`#128 `_)." msgstr "" -#: ../../changelog.rst:379 +#: ../../changelog.rst:390 msgid "" "Force backup (`#123 `_)." msgstr "" -#: ../../changelog.rst:380 +#: ../../changelog.rst:391 msgid "" "Update clean-install.md (`#131 `_)." msgstr "" -#: ../../changelog.rst:381 +#: ../../changelog.rst:392 msgid "" "Improve data export field names (`#132 " "`_)." msgstr "" -#: ../../changelog.rst:382 +#: ../../changelog.rst:393 msgid "" "Display average temperature in archive (`#122 " "`_)." msgstr "" -#: ../../changelog.rst:383 +#: ../../changelog.rst:394 msgid "" "Pie charts on trends page overlap their canvas (`#136 " "`_)." msgstr "" -#: ../../changelog.rst:384 +#: ../../changelog.rst:395 msgid "" "'Slumber' consumption (`#115 `_)." msgstr "" -#: ../../changelog.rst:385 +#: ../../changelog.rst:396 msgid "" "Show lowest & highest Watt peaks (`#138 " "`_)." msgstr "" -#: ../../changelog.rst:386 +#: ../../changelog.rst:397 msgid "" "Allow day & hour statistics reset due to changing energy prices (`#95 " "`_)." msgstr "" -#: ../../changelog.rst:391 +#: ../../changelog.rst:402 msgid "v1.1.2 - 2016-05-01" msgstr "" -#: ../../changelog.rst:394 +#: ../../changelog.rst:405 msgid "" "Trends page giving errors (when lacking data) (`#125 " "`_)." msgstr "" -#: ../../changelog.rst:399 +#: ../../changelog.rst:410 msgid "v1.1.1 - 2016-04-27" msgstr "" -#: ../../changelog.rst:402 +#: ../../changelog.rst:413 msgid "" "Improve readme (`#124 `_)." msgstr "" -#: ../../changelog.rst:407 +#: ../../changelog.rst:418 msgid "v1.1.0 - 2016-04-23" msgstr "" -#: ../../changelog.rst:410 +#: ../../changelog.rst:421 msgid "" "Autorefresh dashboard (`#117 `_)." msgstr "" -#: ../../changelog.rst:411 +#: ../../changelog.rst:422 msgid "" "Improve line graphs' visibility (`#111 " "`_)." msgstr "" -#: ../../changelog.rst:412 +#: ../../changelog.rst:423 msgid "" "Easily add notes (`#110 `_)." msgstr "" -#: ../../changelog.rst:413 +#: ../../changelog.rst:424 msgid "" "Export data points in CSV format (`#2 `_)." msgstr "" -#: ../../changelog.rst:414 +#: ../../changelog.rst:425 msgid "" "Allow day/month/year comparison (`#94 `_)." msgstr "" -#: ../../changelog.rst:415 +#: ../../changelog.rst:426 msgid "" "Docs: Add FAQ and generic application info (`#113 " "`_)." msgstr "" -#: ../../changelog.rst:416 +#: ../../changelog.rst:427 msgid "" "Support for Iskra meter (DSMR 2.x) (`#120 " "`_)." msgstr "" -#: ../../changelog.rst:421 +#: ../../changelog.rst:432 msgid "v1.0.1 - 2016-04-07" msgstr "" -#: ../../changelog.rst:424 +#: ../../changelog.rst:435 msgid "" "Update licence to OSI compatible one (`#119 " "`_)." msgstr "" -#: ../../changelog.rst:429 +#: ../../changelog.rst:440 msgid "v1.0.0 - 2016-04-07" msgstr "" -#: ../../changelog.rst:430 +#: ../../changelog.rst:441 msgid "First official stable release." msgstr "Eerste officiële stabiele release." -#: ../../changelog.rst:435 +#: ../../changelog.rst:446 msgid "[β] v0.1 (2015-10-29) to 0.16 (2016-04-06)" msgstr "" -#: ../../changelog.rst:438 +#: ../../changelog.rst:449 msgid "" "All previous beta releases/changes have been combined to a single list " "below." @@ -1296,444 +1330,444 @@ msgstr "" "Alle vorige bèta releases/veranderingen zijn gecombineerd tot een enkele " "lijst hieronder." -#: ../../changelog.rst:440 +#: ../../changelog.rst:451 msgid "" "Move documentation to wiki or RTD (`#90 " "`_)." msgstr "" -#: ../../changelog.rst:441 +#: ../../changelog.rst:452 msgid "" "Translate README to Dutch (`#16 `_)." msgstr "" -#: ../../changelog.rst:442 +#: ../../changelog.rst:453 msgid "" "Delete (recent) history page (`#112 `_)." msgstr "" -#: ../../changelog.rst:443 +#: ../../changelog.rst:454 msgid "" "Display most recent temperature in dashboard (`#114 " "`_)." msgstr "" -#: ../../changelog.rst:444 +#: ../../changelog.rst:455 msgid "" "Upgrade Django to 1.8.12 (`#118 `_)." msgstr "" -#: ../../changelog.rst:446 +#: ../../changelog.rst:457 msgid "" "Redesign trends page (`#97 `_)." msgstr "" -#: ../../changelog.rst:447 +#: ../../changelog.rst:458 msgid "" "Support for summer time (`#105 `_)." msgstr "" -#: ../../changelog.rst:448 +#: ../../changelog.rst:459 msgid "" "Support for Daylight Saving Time (DST) transition (`#104 " "`_)." msgstr "" -#: ../../changelog.rst:449 +#: ../../changelog.rst:460 msgid "" "Add (error) hints to status page (`#106 " "`_)." msgstr "" -#: ../../changelog.rst:450 +#: ../../changelog.rst:461 msgid "" "Keep track of version (`#108 `_)." msgstr "" -#: ../../changelog.rst:452 +#: ../../changelog.rst:463 msgid "" "Django 1.8.11 released (`#82 `_)." msgstr "" -#: ../../changelog.rst:453 +#: ../../changelog.rst:464 msgid "" "Prevent tests from failing due to moment of execution (`#88 " "`_)." msgstr "" -#: ../../changelog.rst:454 +#: ../../changelog.rst:465 msgid "" "Statistics page meter positions are broken (`#93 " "`_)." msgstr "" -#: ../../changelog.rst:455 +#: ../../changelog.rst:466 msgid "" "Archive only shows graph untill 23:00 (11 pm) (`#77 " "`_)." msgstr "" -#: ../../changelog.rst:456 +#: ../../changelog.rst:467 msgid "" "Trends page crashes due to nullable fields average (`#100 " "`_)." msgstr "" -#: ../../changelog.rst:457 +#: ../../changelog.rst:468 msgid "" "Trends: Plot peak and off-peak relative to each other (`#99 " "`_)." msgstr "" -#: ../../changelog.rst:458 +#: ../../changelog.rst:469 msgid "" "Monitor requirements with requires.io (`#101 " "`_)." msgstr "" -#: ../../changelog.rst:459 +#: ../../changelog.rst:470 msgid "" "Terminology (`#41 `_)." msgstr "" -#: ../../changelog.rst:460 +#: ../../changelog.rst:471 msgid "" "Obsolete signals in dsmr_consumption (`#63 " "`_)." msgstr "" -#: ../../changelog.rst:461 +#: ../../changelog.rst:472 msgid "" "Individual app testing coverage (`#64 `_)." msgstr "" -#: ../../changelog.rst:462 +#: ../../changelog.rst:473 msgid "" "Support for extra devices on other M-bus (0-n:24.1) (`#92 " "`_)." msgstr "" -#: ../../changelog.rst:463 +#: ../../changelog.rst:474 msgid "" "Separate post-deployment commands (`#102 " "`_)." msgstr "" -#: ../../changelog.rst:465 +#: ../../changelog.rst:476 msgid "" "Show exceptions in production (webinterface) (`#87 " "`_)." msgstr "" -#: ../../changelog.rst:466 +#: ../../changelog.rst:477 msgid "" "Keep Supervisor processes running (`#79 " "`_)." msgstr "" -#: ../../changelog.rst:467 +#: ../../changelog.rst:478 msgid "" "Hourly stats of 22:00:00+00 every day lack gas (`#78 " "`_)." msgstr "" -#: ../../changelog.rst:468 +#: ../../changelog.rst:479 msgid "" "Test Travis-CI with MySQL + MariaDB + PostgreSQL (`#54 " "`_)." msgstr "" -#: ../../changelog.rst:469 +#: ../../changelog.rst:480 msgid "" "PostgreSQL tests + nosetests + coverage failure: unrecognized " "configuration parameter \"foreign_key_checks\" (`#62 " "`_)." msgstr "" -#: ../../changelog.rst:470 +#: ../../changelog.rst:481 msgid "" "Performance check (`#83 `_)." msgstr "" -#: ../../changelog.rst:471 +#: ../../changelog.rst:482 msgid "" "Allow month & year archive (`#66 `_)." msgstr "" -#: ../../changelog.rst:472 +#: ../../changelog.rst:483 msgid "" "Graphs keep increasing height on tablet (`#89 " "`_)." msgstr "" -#: ../../changelog.rst:474 +#: ../../changelog.rst:485 msgid "" "Delete StatsSettings(.track) settings model (`#71 " "`_)." msgstr "" -#: ../../changelog.rst:475 +#: ../../changelog.rst:486 msgid "" "Drop deprecated commands (`#22 `_)." msgstr "" -#: ../../changelog.rst:476 +#: ../../changelog.rst:487 msgid "" "Datalogger doesn't work properly with DSMR 4.2 (KAIFA-METER) (`#73 " "`_)." msgstr "" -#: ../../changelog.rst:477 +#: ../../changelog.rst:488 msgid "" "Dashboard month statistics costs does not add up (`#75 " "`_)." msgstr "" -#: ../../changelog.rst:478 +#: ../../changelog.rst:489 msgid "" "Log unhandled exceptions and errors (`#65 " "`_)." msgstr "" -#: ../../changelog.rst:479 +#: ../../changelog.rst:490 msgid "" "Datalogger crashes with IntegrityError because 'timestamp' is null (`#74 " "`_)." msgstr "" -#: ../../changelog.rst:480 +#: ../../changelog.rst:491 msgid "" "Trends are always shown in UTC (`#76 `_)." msgstr "" -#: ../../changelog.rst:481 +#: ../../changelog.rst:492 msgid "" "Squash migrations (`#31 `_)." msgstr "" -#: ../../changelog.rst:482 +#: ../../changelog.rst:493 msgid "" "Display 'electricity returned' graph in dashboard (`#81 " "`_)." msgstr "" -#: ../../changelog.rst:483 +#: ../../changelog.rst:494 msgid "" "Optional gas (and electricity returned) capabilities tracking (`#70 " "`_)." msgstr "" -#: ../../changelog.rst:484 +#: ../../changelog.rst:495 msgid "" "Add 'electricity returned' to trends page (`#84 " "`_)." msgstr "" -#: ../../changelog.rst:486 +#: ../../changelog.rst:497 msgid "" "Archive: View past days details (`#61 `_)." msgstr "" -#: ../../changelog.rst:487 +#: ../../changelog.rst:498 msgid "" "Dashboard: Consumption total for current month (`#60 " "`_)." msgstr "" -#: ../../changelog.rst:488 +#: ../../changelog.rst:499 msgid "" "Check whether gas readings are optional (`#34 " "`_)." msgstr "" -#: ../../changelog.rst:489 +#: ../../changelog.rst:500 msgid "" "Django security releases issued: 1.8.10 (`#68 " "`_)." msgstr "" -#: ../../changelog.rst:490 +#: ../../changelog.rst:501 msgid "" "Notes display in archive (`#69 `_)." msgstr "" -#: ../../changelog.rst:492 +#: ../../changelog.rst:503 msgid "" "Status page/alerts when features are disabled/unavailable (`#45 " "`_)." msgstr "" -#: ../../changelog.rst:493 +#: ../../changelog.rst:504 msgid "" "Integrate Travis CI (`#48 `_)." msgstr "" -#: ../../changelog.rst:494 +#: ../../changelog.rst:505 msgid "" "Testing coverage (`#38 `_)." msgstr "" -#: ../../changelog.rst:495 +#: ../../changelog.rst:506 msgid "" "Implement automatic backups & Dropbox cloud storage (`#44 " "`_)." msgstr "" -#: ../../changelog.rst:496 +#: ../../changelog.rst:507 msgid "" "Link code coverage service to repository (`#56 " "`_)." msgstr "" -#: ../../changelog.rst:497 +#: ../../changelog.rst:508 msgid "" "Explore timezone.localtime() as replacement for datetime.astimezone() " "(`#50 `_)." msgstr "" -#: ../../changelog.rst:498 +#: ../../changelog.rst:509 msgid "" "Align GasConsumption.read_at to represent the start of hour (`#40 " "`_)." msgstr "" -#: ../../changelog.rst:500 +#: ../../changelog.rst:511 msgid "" "Cleanup unused static files (`#47 `_)." msgstr "" -#: ../../changelog.rst:501 +#: ../../changelog.rst:512 msgid "" "Investigated mysql_tzinfo_to_sql — Load the Time Zone Tables (`#35 " "`_)." msgstr "" -#: ../../changelog.rst:502 +#: ../../changelog.rst:513 msgid "" "Make additional DSMR data optional (`#46 " "`_)." msgstr "" -#: ../../changelog.rst:503 +#: ../../changelog.rst:514 msgid "" "Localize graph x-axis (`#42 `_)." msgstr "" -#: ../../changelog.rst:504 +#: ../../changelog.rst:515 msgid "" "Added graph formatting string to gettext file (`#42 " "`_)." msgstr "" -#: ../../changelog.rst:505 +#: ../../changelog.rst:516 msgid "" "Different colors for peak & off-peak electricity (`#52 " "`_)." msgstr "" -#: ../../changelog.rst:506 +#: ../../changelog.rst:517 msgid "" "Admin: Note widget (`#51 `_)." msgstr "" -#: ../../changelog.rst:507 +#: ../../changelog.rst:518 msgid "" "Allow GUI to run without data (`#26 `_)." msgstr "" -#: ../../changelog.rst:509 +#: ../../changelog.rst:520 msgid "" "Moved project to GitHub (`#28 `_)." msgstr "" -#: ../../changelog.rst:510 +#: ../../changelog.rst:521 msgid "Added stdout to dsmr_backend to reflect progress." msgstr "" -#: ../../changelog.rst:511 +#: ../../changelog.rst:522 msgid "" "Restore note usage in GUI (`#39 `_)." msgstr "" -#: ../../changelog.rst:513 +#: ../../changelog.rst:524 msgid "" "Store daily, weekly, monthly and yearly statistics (`#3 " "`_)." msgstr "" -#: ../../changelog.rst:514 +#: ../../changelog.rst:525 msgid "" "Improved Recent History page performance a bit. (as result of `#3 " "`_)" msgstr "" -#: ../../changelog.rst:515 +#: ../../changelog.rst:526 msgid "" "Updates ChartJS library tot 1.1, disposing django-chartjs plugin. Labels " "finally work! (as result of `#3 `_)" msgstr "" -#: ../../changelog.rst:516 +#: ../../changelog.rst:527 msgid "" "Added trends page. (as result of `#3 `_)" msgstr "" -#: ../../changelog.rst:518 +#: ../../changelog.rst:529 msgid "" "Recent history setting: set range (`#29 " "`_)." msgstr "" -#: ../../changelog.rst:519 +#: ../../changelog.rst:530 msgid "" "Mock required for test: dsmr_weather.test_weather_tracking (`#32 " "`_)." msgstr "" -#: ../../changelog.rst:521 +#: ../../changelog.rst:532 msgid "" "Massive refactoring: Separating apps & using signals (`#19 " "`_)." msgstr "" -#: ../../changelog.rst:522 +#: ../../changelog.rst:533 msgid "" "README update: Exit character for cu (`#27 " "`_, by Jeroen " "Peters)." msgstr "" -#: ../../changelog.rst:523 +#: ../../changelog.rst:534 msgid "Fixed untranslated strings in admin interface." msgstr "" -#: ../../changelog.rst:524 +#: ../../changelog.rst:535 msgid "Upgraded Django to 1.8.9." msgstr "" @@ -1746,3 +1780,6 @@ msgstr "" #~ msgid "v1.11.0 - 2017-xx-xx" #~ msgstr "" +#~ msgid "v1.12.0 - 2018-xx-xx" +#~ msgstr "" + diff --git a/docs/locale/nl/LC_MESSAGES/donations.mo b/docs/locale/nl/LC_MESSAGES/donations.mo new file mode 100644 index 0000000000000000000000000000000000000000..b297fb83ac488a554edeebbe4b0c212cfe2b4dfb GIT binary patch literal 1336 zcmb7DO^+Nk5Op9R7&swu<4_v~DH+kdY$TM;EEA+<7qlWPjW#O+7fAJV^^B+8cFT5e zrz4J$I3aQ2Kfr~bl;6U0&+H~wES1Xkt8#t#)$31g|D~|rhkOQk0{IB?8zim2A%8;t zfqV#=-BLPbrv> zanljzHw)0s!gC5P2yZ;9_S=a~r@h8wyI6%#{2lLO4}9nI}lhQ zTrG@nkYsFKL>@5H+I$WN@ipY;O!y16m9@6Oy}8T-#Om|7_{Rt%pV-lc00dkX>U#k_m3v$XXmGH z(mBY#oP6tS6pL^}i`S#Pi2JQ!ZI5WVW*;QZyI5t1Z|qW9mH6z`E?tSf&FHYuaq_)b z@f-zp3^O|BLJU2~zse6LKV>^CRkCnW>WJbG^M}CHGiF~Vrf%@H0Ir!0)`3Ckw$U4k zp6e(+QL!a~Dzx|r5X`J`RfFRi96tqA8__oLBvCZcJzx|{d??I&=SxhDiF#AgO8Q;! z@|w{S)H9JtCCKr1Hq+^~4@$)RMS*wWI}D_ymte$8y|LgmPRUi*)L^#ISTq5scebou z1FptY4vZWUkzS+*qYGx6r;$o+zzC-LI<#V&oln%ff<4YL^&^7)wu8FKA*Q&fb0dY( hQUTToH2PrI^_afhFywSRwj$neJH@=xO#g@3{{eK4pg{lt literal 0 HcmV?d00001 diff --git a/docs/locale/nl/LC_MESSAGES/donations.po b/docs/locale/nl/LC_MESSAGES/donations.po new file mode 100644 index 000000000..8453cb8ae --- /dev/null +++ b/docs/locale/nl/LC_MESSAGES/donations.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) 2016, Dennis Siemensma +# This file is distributed under the same license as the DSMR Reader +# package. +# FIRST AUTHOR , 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: DSMR Reader 1.x\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language: nl\n" +"Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.5.1\n" +"X-Generator: Poedit 1.8.7.1\n" + +#: ../../donations.rst:2 +msgid "Donations" +msgstr "Donaties" + +#: ../../donations.rst:4 +msgid "" +"Do you like this project and do you want to buy me a beer or coffee? You " +"are always welcome to make a small donation as a token of appreciation!" +msgstr "" +"Waardeer je dit project en wil je mij trakteren op een biertje of kop " +"koffie? Een kleine donatie als bedankje wordt altijd gewaardeerd!" + +#: ../../donations.rst:8 +msgid "`Donate using PayPal `_" +msgstr "`Doneer via PayPal `_" + +#: ../../donations.rst:12 +msgid "" +"Know that this project **will always be free to use** and I already do " +"make a living with my regular job." +msgstr "" +"Weet dat dit project **altijd gratis te gebruiken zal zijn** en dat ik " +"momenteel al rondkom met mijn doordeweekse baan." + +#: ../../donations.rst:14 +msgid "" +"Please do not pressure me by \"donating for new features\", but only for " +"liking what you are using so far... Thanks! =)" +msgstr "" +"Doneer alleen uit waardering voor wat je tot nu toe gebruikt en " +"alsjeblieft niet voor nieuwe features. Bedankt! =)" diff --git a/docs/locale/nl/LC_MESSAGES/installation.mo b/docs/locale/nl/LC_MESSAGES/installation.mo index 3291a7160c01675d38062f03a3542a4102069711..18dff777c3472fd70b22e80c02aaa4c4f29dd18b 100644 GIT binary patch delta 3291 zcma*oZE#f88Nl&pC1k@}(9jUWi#fbW0_+kJK-n}b1j9R#NFbP|B{#d5&63@F;qKkU zjoP(SY6a?$8epvbqGJX5(s5iz?a-H?ovGsZp)=G@r(>t1t#*pSI77$jr}lsD*;qgJ zOwRt!xqJ5BbI$Xen_s>edgC{t;$Lbi&I=_=T|_-OO+;V#tdbAPmKh>GZpHcdI$pu| z@k=~4Q)Cx@Zw%~JUzZ?-JkKt>$7uVfmZuDJzi2lzpgP{hIZglV?oW#rc zqS9L`vX6M`37o-ocm>DsbJQUkTFN9ax0LqU0bzfOYe!^Im-2!@g9NY{PlxMgu3 z{l}2JlX29i=o0FkdK>3p@e>;4mE1;7h*aNi1~%X^9@vISu3seONpP7JBXMvE&cZ!- z0ei6pZ{kV)eVfQeJz>-j{_vY3hw$H6gZoJo)>4!NjT{%AMG{kHZ)V&0VH4^dIT$y` z<*6;42)=&@^>ORpYL43p?4bWD4&cA=$9RZ~Y^MAJiH0oLX70ZW`{*CVJ^K7#rJ;}8 zoCnM?+J<@hH}DO#I?c-Kx0@BO#aFrBh9h_rb<)~9OwL@u@6fL!PH7y$NAa(yL*2j2 zEMN>rdA^*b;b3^TnehmE^j}7OqlJ4!9>y`ef!FaBoaBu1Q#nB*=mlIsz2YzM`?##j z9Jfm-AtsH(G)oT>T5Qy=DSed)fcXTv&5h};hmn5sptms2O4oebyl^sXUqO$EELpd90K8R@?k)*SbI-5F3)kP=bW@-&p$DTK+)KMeUCaO+q(n0Q~)>3tuLtRB(qC1o$RB|qO zUyxcsxvOkCkUiv>2SuNNsj{3#hT2TMr+jfy*&*CX-AJ8ACCR@k-KD3iE>~7Le%i^~ zu~?~fZldzO1KoR-ANc9CajE|i>qBxJIarv z^An-scGpu@a>Q~Hc2ebYwwH^lttyw#W-YIv+@s3MWK_bX>m+k3ljequbCTS4pY0F1 zN!1Y*eG``_dO33oH9F*~QOjXYZr0}h$+Vw#9c4dqJY%IDE9h8*Zr*QXsO9U~7L?`L zjIa`Zrl68;+DWZVJFF>_p&2cW*L_*Bs{F{UG1Z+ z#nhZ$N5Rbpv(4w2T2r+2;IhuDX+2(H;!3=sG_m@nig-*pnVEYnCzZEScBIF)vN1Jt zecD1glZ6e-$V%mo2y3%BGPk7c2OFx+{CusBT z9}ib|q>qibt~Y4gnIzY;Tf9*55EoR+wt`UV(R2pAe0n$tX(vl}xye{MG2|=8=(v(0 zCa~_x+|+1axnB#etvcAg;MT!-lE5ZP|GV=Vl}yw3td&+uji$M$qeg9Ce-hTQazIr+ z?T@(p(uq!t*KIB>>ZqCCVq#`1f_cEP^=!(~Bt7hMMD_F4PM(_OVyYC`5uF}NmHPJ{ zzN4zcPNf|k+ds#jIjr`3F1tahTbAco|7V07N$*iRGi;l{+Ul6CTz7bCc|MUXbzQ9r Omv0_KH`n`a#eV@YS3^Sp delta 2397 zcmYk-YfzL`7{Kvoby+}NK@jC4@+u;DSt>*fh>*k!Y6_^Sq{0dtYU^&Yt7+D(CQgZ# zm$k-hn(>2OoIX^%PTB=CzEsXQU zSFSHlyJ7=r?l*)IAjS~2gGKgW(8GapAW0;O2XPd7l10A2T)c}vV;x=?BC-f`hSG-{ z(8AhbBEvC&DHz3c?8F?Am>i)pj*gS)#fvxrf5TKvrjs8^HkP3W`8?RlC zp^^0A2gsk4W{AwhIy{bDxC9^KX`Q$W^@EZ|i&Ucz^Km0i=lODw$~pW7JMd7ZNpV7! zd6BP?WJo{0k5_O3?#bpM_ya~Tfix|{ZMYo!uo(*(*B9{>T!`*mb6o?*8tK?cC5Zjl zfHh-9u3{Wd;Fdg-GRra-uE9s>e;r@Iv&isEOj%RR5FMUE{x@;rIvx5&P0XA_xDU5to=+r;2Oq%}+TF!u1JlVnUDAal zO-^GXzq^RrXb(chMJMt zs5e@Px(c2{&Covd;z!7IkRD`$%a5qPyN(-ppu3EjPdhw=3}Qc$47rJKVr=B2X7+!G zopcOf85g#en;RXi5P6FJPcaR>mAouk7{O)8ypr#53fEmjU8ZSOX133MoO#6g-KeW2 ztJMg|~1h zZC5SBgX%MhL`tz4 zi*PUgjwdl6k1jTI;S6@szJhOIuwLX>^fWLWcoX#lFEnxuRxUAPe-UH)z>Q1II{yjZ zrv36VvmuRT;Pu8g@EMFQ=PU3Mk~9gf5IKz9s1KM+I;#1gPf+)T+f8OQ1fOPjXkWu| zn7xYOK??b&uxf-X%S__`Wf%?Sjk7WsR%iUmQ8Q-|!->@dA0mvJv-|0)V6HwWIn;PR zC*}Wk>O|(j;uOoBhrrf!~$Xj z!76h~9>)}7D$(rpu+1ZL*I7NSrf;nHsg#+9j7IhiXUAgBiP%-iCp`A;lorpJh!qM) ztw_}05w+Sj2drq=3Wi(#!9b+iiofI=@3P{%C#J>wF2WsNJ(@#UMMW@obX) JXVbUte*pVRFeLy0 diff --git a/docs/locale/nl/LC_MESSAGES/installation.po b/docs/locale/nl/LC_MESSAGES/installation.po index 74f279cf8..43b955cb9 100644 --- a/docs/locale/nl/LC_MESSAGES/installation.po +++ b/docs/locale/nl/LC_MESSAGES/installation.po @@ -1,4 +1,4 @@ -# Translations template for PROJECT. +# Dutch translations for PROJECT. # Copyright (C) 2017 ORGANIZATION # This file is distributed under the same license as the PROJECT project. # FIRST AUTHOR , 2017. @@ -8,12 +8,13 @@ msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" "Last-Translator: \n" +"Language: nl\n" "Language-Team: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.3.4\n" -"Language: nl\n" +"Generated-By: Babel 2.5.1\n" "X-Generator: Poedit 1.8.7.1\n" #: ../../installation.rst:2 @@ -58,10 +59,58 @@ msgstr "" "om dit project handmatig te installeren." #: ../../installation.rst:28 +msgid "Method A: Quick install" +msgstr "Methode A: Snelle installatie" + +#: ../../installation.rst:29 +msgid "For advanced users. A summary of all commands listed under Method B." +msgstr "" +"Voor geavanceerde gebruikers. Een overzicht van alle commando's gebruikt onder " +"Methode B::" + +#: ../../installation.rst:31 +msgid "Start::" +msgstr "Begin::" + +#: ../../installation.rst:38 ../../installation.rst:118 +msgid "Does PostgreSQL not start/create the cluster due to locales? I.e.::" +msgstr "Start PostgreSQL niet wegens een fout in 'locales'? Bijvoorbeeld::" + +#: ../../installation.rst:46 ../../installation.rst:126 +msgid "Try: ``dpkg-reconfigure locales``." +msgstr "Probeer: ``dpkg-reconfigure locales``." + +#: ../../installation.rst:48 ../../installation.rst:128 +msgid "" +"Still no luck? Try editing ``/etc/environment``, add ``LC_ALL=\"en_US.utf-8\"`` " +"and reboot. Then try ``pg_createcluster 9.4 main --start`` again (or whatever " +"version you are using)." +msgstr "" +"Werkt het nog steeds niet? Open dan dit bestand ``/etc/environment``, voeg " +"onderaan de regel ``LC_ALL=\"en_US.utf-8\"`` toe en herstart het systeem. " +"Probeer daarna ``pg_createcluster 9.4 main --start`` (of welke versie je ook " +"gebruikt)." + +#: ../../installation.rst:51 +msgid "Continue::" +msgstr "Ga verder::" + +#: ../../installation.rst:100 +msgid "Method B: Manually" +msgstr "Methode B: Handmatig" + +#: ../../installation.rst:101 +msgid "" +"For others users who want some addition explaination about what they are " +"exactly doing/installing." +msgstr "" +"Voor alle andere gebruikers, die graag willen weten wat ze exact uitvoeren." + +#: ../../installation.rst:104 msgid "1. Database backend (PostgreSQL)" msgstr "1. Databaseopslag (PostgreSQL)" -#: ../../installation.rst:30 +#: ../../installation.rst:106 msgid "" "The application stores by default all readings taken from the serial cable. " "There is support for **PostgreSQL**, and there used to be support for **MySQL/" @@ -73,7 +122,7 @@ msgstr "" "laatstgenoemde momenteel afgeraden om te gebruiken (ondersteuning vervalt " "later)." -#: ../../installation.rst:34 +#: ../../installation.rst:110 msgid "" "Install PostgreSQL, ``postgresql-server-dev-all`` is required for the " "virtualenv installation later in this guide." @@ -81,22 +130,11 @@ msgstr "" "Installeer PostgreSQL. Daarnaast is ``postgresql-server-dev-all`` nodig voor " "het installeren van de VirtualEnv later." -#: ../../installation.rst:36 ../../installation.rst:81 +#: ../../installation.rst:112 ../../installation.rst:169 msgid "Install database::" msgstr "Installeer database::" -#: ../../installation.rst:40 -msgid "" -"Does Postgres not start due to locales? Try: ``dpkg-reconfigure locales``. " -"Still no luck? Try editing ``/etc/environment``, add ``LC_ALL=\"en_US.utf-8\"`` " -"and reboot." -msgstr "" -"Start PostgreSQL niet wegens een fout in 'locales'? Probeer dan het volgende: " -"``dpkg-reconfigure locales``. Werkt het nog steeds niet? Open dan dit bestand " -"``/etc/environment``, voeg onderaan de regel ``LC_ALL=\"en_US.utf-8\"`` toe en " -"herstart het systeem." - -#: ../../installation.rst:43 +#: ../../installation.rst:131 msgid "" "(!) Ignore any '*could not change directory to \"/root\": Permission denied*' " "errors for the following three commands." @@ -104,43 +142,43 @@ msgstr "" "(!) Negeer voor de volgende drie commando's de foutmelding: '*could not change " "directory to \"/root\": Permission denied*'." -#: ../../installation.rst:45 ../../installation.rst:89 +#: ../../installation.rst:133 ../../installation.rst:177 msgid "Create database user::" msgstr "Creëer databasegebruiker::" -#: ../../installation.rst:49 +#: ../../installation.rst:137 msgid "Create database, owned by the database user we just created::" msgstr "" "Creëer database, met als eigenaar de databasegebruiker die we net hebben " "aangemaakt::" -#: ../../installation.rst:53 +#: ../../installation.rst:141 msgid "Set password for database user::" msgstr "Stel wachtwoord in voor databasegebruiker::" -#: ../../installation.rst:59 +#: ../../installation.rst:147 msgid "" "**Optional**: Do you need to restore a **PostgreSQL** database backup as well?" msgstr "" "**Optioneel**: Wil je ook nog een **PostgreSQL** database back-up herstellen?" -#: ../../installation.rst:61 ../../installation.rst:105 +#: ../../installation.rst:149 ../../installation.rst:193 msgid "Restore an uncompressed (``.sql``) backup with::" msgstr "Herstel een ongecomprimeerde (``.sql``) back-up met::" -#: ../../installation.rst:65 ../../installation.rst:109 +#: ../../installation.rst:153 ../../installation.rst:197 msgid "Or restore a compressed (``.gz``) backup with::" msgstr "Of herstel een gecomprimeerde (``.gz``) back-up met::" -#: ../../installation.rst:69 +#: ../../installation.rst:157 msgid "Now continue at chapter 2 below (Dependencies)." msgstr "Ga door naar hoofdstuk 2 verderop (Dependencies)." -#: ../../installation.rst:72 ../../installation.rst:257 +#: ../../installation.rst:160 ../../installation.rst:345 msgid "(Legacy) MySQL/MariaDB" msgstr "(Legacy) MySQL/MariaDB" -#: ../../installation.rst:75 ../../installation.rst:260 +#: ../../installation.rst:163 ../../installation.rst:348 msgid "" "Support for the MySQL database backend is deprecated and will be removed in a " "later release. Please use a PostgreSQL database instead. Users already running " @@ -150,7 +188,7 @@ msgstr "" "in een latere release. Gebruik daarom PostgreSQL. Gebruikers die dit project al " "op MySQL draaien krijgen in de toekomst ondersteuning om te migreren." -#: ../../installation.rst:78 +#: ../../installation.rst:166 msgid "" "Install MariaDB. You can also choose to install the closed source MySQL, as " "they should be interchangeable anyway. ``libmysqlclient-dev`` is required for " @@ -160,27 +198,27 @@ msgstr "" "installeren. Welke je ook kiest, ``libmysqlclient-dev`` is later nodig voor de " "VirtualEnv." -#: ../../installation.rst:85 +#: ../../installation.rst:173 msgid "Create database::" msgstr "Creëer database::" -#: ../../installation.rst:93 +#: ../../installation.rst:181 msgid "Set privileges for database user::" msgstr "Stel rechten in voor databasegebruiker::" -#: ../../installation.rst:97 +#: ../../installation.rst:185 msgid "Flush privileges to activate them::" msgstr "Pas de databaserechten toe::" -#: ../../installation.rst:103 +#: ../../installation.rst:191 msgid "**Optional**: Do you need to restore a **MySQL** database backup as well?" msgstr "**Optioneel**: Wil je ook nog een **MySQL** database back-up herstellen?" -#: ../../installation.rst:115 +#: ../../installation.rst:203 msgid "2. Dependencies" msgstr "2. Afhankelijkheden" -#: ../../installation.rst:116 +#: ../../installation.rst:204 msgid "" "Now you'll have to install several utilities, required for the Nginx webserver, " "Gunicorn application server and cloning the application code from the Github " @@ -190,7 +228,7 @@ msgstr "" "de Gunicorn applicatieserver en voor het binnenhalen van de code van de " "applicatie vanaf Github::" -#: ../../installation.rst:120 +#: ../../installation.rst:208 msgid "" "Install ``cu``. The CU program allows easy testing for your DSMR serial " "connection. It's very basic but also very effective to simply test whether your " @@ -200,11 +238,11 @@ msgstr "" "verbinding testen naar je slimme meter toe. Erg handig om te kijken of dat " "überhaupt al lekker werkt::" -#: ../../installation.rst:127 +#: ../../installation.rst:215 msgid "3. Application user" msgstr "3. Applicatiegebruiker" -#: ../../installation.rst:128 +#: ../../installation.rst:216 msgid "" "The application runs as ``dsmr`` user by default. This way we do not have to " "run the application as ``root``, which is a bad practice anyway." @@ -212,7 +250,7 @@ msgstr "" "De applicatie draait standaard onder de gebruiker ``dsmr``. Hierdoor heeft het " "geen ``root``-rechten (nodig), wat over het algemeen zeer afgeraden wordt." -#: ../../installation.rst:130 +#: ../../installation.rst:218 msgid "" "Create user with homedir. The application code and virtualenv will reside in " "this directory as well::" @@ -220,7 +258,7 @@ msgstr "" "Maak een aparte gebruiker aan met eigen homedir. De code voor de applicatie en " "VirtualEnv zetten we later hier in::" -#: ../../installation.rst:134 +#: ../../installation.rst:222 msgid "" "Our user also requires dialout permissions. So allow the user to perform a " "dialout by adding it to the ``dialout`` group::" @@ -228,7 +266,7 @@ msgstr "" "De gebruiker heeft ook toegang nodig om de kabel te kunnen uitlezen. Hiervoor " "voegen de we gebruiker toe aan de groep ``dialout``::" -#: ../../installation.rst:138 +#: ../../installation.rst:226 msgid "" "Either proceed to the next heading **for a test reading** or continue at " "chapter 4." @@ -236,11 +274,11 @@ msgstr "" "Ga ofwel door naar het volgende hoofdstuk **voor een testmeting** of ga direct " "door naar stap 4." -#: ../../installation.rst:142 +#: ../../installation.rst:230 msgid "Your first reading (optional)" msgstr "Je allereerste (optionele) meting" -#: ../../installation.rst:146 +#: ../../installation.rst:234 msgid "" "**OPTIONAL**: You may skip this section as it's not required for the " "application to install. However, if you have never read your meter's P1 " @@ -252,7 +290,7 @@ msgstr "" "nog nooit eerder je P1-poort hebt uitgelezen. Hiermee verzeker je jezelf ook " "dat de applicatie straks dezelfde (werkende) toegang heeft voor de metingen." -#: ../../installation.rst:148 +#: ../../installation.rst:236 msgid "" "Now login as the user we have just created, to perform our very first " "reading! ::" @@ -260,15 +298,15 @@ msgstr "" "Log nu in als de gebruiker die we zojuist hebben aangemaakt voor de eerste " "testmeting! ::" -#: ../../installation.rst:152 +#: ../../installation.rst:240 msgid "Test with ``cu`` for **DSMR 4+**::" msgstr "Test met ``cu`` voor **DSMR 4+**::" -#: ../../installation.rst:156 +#: ../../installation.rst:244 msgid "Or test with ``cu`` for **DSMR 2.2** (untested)::" msgstr "Of test met ``cu`` voor **DSMR 2.2** (ongetest)::" -#: ../../installation.rst:160 +#: ../../installation.rst:248 msgid "" "You now should see something similar to ``Connected.`` and a wall of text and " "numbers *within 10 seconds*. Nothing? Try different BAUD rate, as mentioned " @@ -281,7 +319,7 @@ msgstr "" "Of `kijk op een nuttig weblog `_." -#: ../../installation.rst:162 +#: ../../installation.rst:250 msgid "" "To exit cu, type \"``q.``\", hit Enter and wait for a few seconds. It should " "exit with the message ``Disconnected.``." @@ -289,11 +327,11 @@ msgstr "" "Om cu af te sluiten, typ \"``q.``\", druk op Enter en wacht voor een paar " "seconden. Het programma sluit af met de melding ``Disconnected.``." -#: ../../installation.rst:166 +#: ../../installation.rst:254 msgid "4. Webserver/Nginx (part 1)" msgstr "4. Webserver/Nginx (deel 1)" -#: ../../installation.rst:168 +#: ../../installation.rst:256 msgid "" "*We will now prepare the webserver, Nginx. It will serve all application's " "static files directly and proxy any application requests to the backend, " @@ -303,7 +341,7 @@ msgstr "" "bestanden en geeft de applicatie-verzoeken door naar de backend, waar de " "applicatie in Gunicorn draait onder Supervisor. Deze stellen we later in.*" -#: ../../installation.rst:170 ../../installation.rst:313 +#: ../../installation.rst:258 ../../installation.rst:401 msgid "" "Make sure you are acting here as ``root`` or ``sudo`` user. If not, press CTRL " "+ D to log out of the ``dsmr`` user." @@ -311,7 +349,7 @@ msgstr "" "Zorg ervoor dat je hier ``root``- of ``sudo``-gebruiker bent. Zo niet, druk op " "CTRL + D om uit te loggen als ``dsmr`` gebruiker." -#: ../../installation.rst:172 +#: ../../installation.rst:260 msgid "" "Django will later copy all static files to the directory below, used by Nginx " "to serve statics. Therefor it requires (write) access to it::" @@ -319,11 +357,11 @@ msgstr "" "Django kopieert alle statische bestanden naar een aparte map, die weer door " "Nginx gebruikt wordt. Daarom is er tevens (schrijf)toegang voor nodig::" -#: ../../installation.rst:180 +#: ../../installation.rst:268 msgid "5. Clone project code from Github" msgstr "5. Kloon project code vanaf Github" -#: ../../installation.rst:181 +#: ../../installation.rst:269 msgid "" "Now is the time to clone the code from the repository into the homedir we " "created." @@ -331,7 +369,7 @@ msgstr "" "Nu kunnen we de code van de applicatie van Github downloaden en in de homedir " "zetten die we net aangemaakt hebben." -#: ../../installation.rst:183 +#: ../../installation.rst:271 msgid "" "Make sure you are now acting as ``dsmr`` user (if not then enter: ``sudo su - " "dsmr``)" @@ -339,11 +377,11 @@ msgstr "" "Zorg ervoor dat je ingelogd bent als ``dsmr``-gebruiker (zo niet, typ dan: " "``sudo su - dsmr``)" -#: ../../installation.rst:185 +#: ../../installation.rst:273 msgid "Clone the repository::" msgstr "Kloon de repository::" -#: ../../installation.rst:189 +#: ../../installation.rst:277 msgid "" "This may take a few seconds. When finished, you should see a new folder called " "``dsmr-reader``, containing a clone of the Github repository." @@ -352,11 +390,11 @@ msgstr "" "genaamd ``dsmr-reader``, met daarin een kopie van de repository zoals die op " "Github staat." -#: ../../installation.rst:193 +#: ../../installation.rst:281 msgid "6. Virtualenv" msgstr "6. VirtualEnv" -#: ../../installation.rst:195 +#: ../../installation.rst:283 msgid "" "The dependencies our application uses are stored in a separate environment, " "also called **VirtualEnv**." @@ -364,7 +402,7 @@ msgstr "" "Alle (externe) afhankelijkheden worden opgeslagen in een aparte omgeving, ook " "wel **VirtualEnv** genoemd." -#: ../../installation.rst:197 +#: ../../installation.rst:285 msgid "" "Although it's just a folder inside our user's homedir, it's very effective as " "it allows us to keep dependencies isolated or to run different versions of the " @@ -377,7 +415,7 @@ msgstr "" "dat dat elkaar bijt. Meer informatie hierover `kan hier gevonden worden `_." -#: ../../installation.rst:200 +#: ../../installation.rst:288 msgid "" "Make sure you are still acting as ``dsmr`` user (if not then enter: ``sudo su - " "dsmr``)" @@ -385,11 +423,11 @@ msgstr "" "Zorg ervoor dat je nog steeds ingelogd bent als ``dsmr``-gebruiker (zo niet, " "typ dan: ``sudo su - dsmr``)" -#: ../../installation.rst:202 +#: ../../installation.rst:290 msgid "Create folder for the virtualenv(s) of this user::" msgstr "Maak map aan voor de VirtualEnv van deze gebruiker::" -#: ../../installation.rst:206 +#: ../../installation.rst:294 msgid "" "Create a new virtualenv, we usually use the same name for it as the application " "or project::" @@ -397,14 +435,14 @@ msgstr "" "Maak een nieuwe VirtualEnv aan. Het is gebruikelijk om hiervoor dezelfde naam " "te gebruiken als die van de applicatie of het project." -#: ../../installation.rst:212 +#: ../../installation.rst:300 msgid "" "Note that it's important to specify **Python 3** as the default interpreter." msgstr "" "N.B.: het is belangrijk dat je voor deze VirtualEnv aangeeft dat **Python 3** " "de gewenste standaardversie is::" -#: ../../installation.rst:214 +#: ../../installation.rst:302 msgid "" "Put both commands below in the ``dsmr`` user's ``~/.bashrc`` file with your " "favorite text editor::" @@ -412,7 +450,7 @@ msgstr "" "Zet beide commands in het ``~/.bashrc`` bestand van de ``dsmr`` gebruiker met " "je favoriete bestandseditor::" -#: ../../installation.rst:220 +#: ../../installation.rst:308 msgid "" "This will both **activate** the virtual environment and cd you into the right " "directory on your **next login** as ``dsmr`` user." @@ -420,7 +458,7 @@ msgstr "" "Hiermee wordt zowel de VirtualEnv geactiveerd en ga je direct naar de juiste " "map. Dit werkt de **eerstvolgende keer** dat je inlogt als ``dsmr`` gebruiker." -#: ../../installation.rst:224 +#: ../../installation.rst:312 msgid "" "You can easily test whether you've configured this correctly by logging out the " "``dsmr`` user (CTRL + D) and login again using ``sudo su - dsmr``." @@ -428,7 +466,7 @@ msgstr "" "Je kunt dit vrij gemakkelijk testen door uit te loggen als ``dsmr`` gebruiker " "(met CTRL + D) en vervolgens weer in te loggen met ``sudo su - dsmr``." -#: ../../installation.rst:226 +#: ../../installation.rst:314 msgid "" "You should see the terminal have a ``(dsmrreader)`` prefix now, for example: " "``(dsmrreader)dsmr@rasp:~/dsmr-reader $``" @@ -436,7 +474,7 @@ msgstr "" "Als het goed is heeft je terminal nu een ``(dsmrreader)`` prefix, bijvoorbeeld: " "``(dsmrreader)dsmr@rasp:~/dsmr-reader $``" -#: ../../installation.rst:228 +#: ../../installation.rst:316 msgid "" "Make sure you've read and executed the note above, because you'll need it for " "the next chapter." @@ -444,11 +482,11 @@ msgstr "" "Zorg ervoor dat je de bovenstaande notitie hebt gelezen en uitgevoerd, " "aangezien ze nodig zijn voor het volgende hoofdstuk." -#: ../../installation.rst:232 +#: ../../installation.rst:320 msgid "7. Application configuration & setup" msgstr "7. Applicatieconfiguratie" -#: ../../installation.rst:233 +#: ../../installation.rst:321 msgid "" "The application will also need the appropriate database client, which is not " "installed by default. For this I created two ready-to-use requirements files, " @@ -459,7 +497,7 @@ msgstr "" "opslaan. Daarvoor heb ik een tweetal requirements-bestanden gemaakt, waar alles " "al in staat wat nodig is. Zoals bijvoorbeeld Django en de databaseverbinding." -#: ../../installation.rst:236 +#: ../../installation.rst:324 msgid "" "The ``base.txt`` contains requirements which the application needs anyway, no " "matter which backend you've choosen." @@ -467,7 +505,7 @@ msgstr "" "Het bestand ``base.txt`` bevat alle afhankelijkheden die de applicatie sowieso " "nodig heeft, ongeacht de databasekeuze die je gemaakt hebt." -#: ../../installation.rst:240 +#: ../../installation.rst:328 msgid "" "**Installation of the requirements below might take a while**, depending on " "your Internet connection, RaspberryPi speed and resources (generally CPU) " @@ -478,15 +516,15 @@ msgstr "" "verbinding en je RaspberryPi. Je hoeft je dus niet zorgen te maken wanneer dit " "lang lijkt te duren. :]" -#: ../../installation.rst:243 +#: ../../installation.rst:331 msgid "PostgreSQL" msgstr "PostgreSQL" -#: ../../installation.rst:244 +#: ../../installation.rst:332 msgid "Did you choose PostgreSQL? Then execute these two lines::" msgstr "Heb je gekozen voor PostgreSQL? Voer dan deze twee regels uit::" -#: ../../installation.rst:251 +#: ../../installation.rst:339 msgid "" "Did everything install without fatal errors? If the database client refuses to " "install due to missing files/configs, make sure you've installed ``postgresql-" @@ -498,15 +536,15 @@ msgstr "" "installatie het volgende hebt uitgevoerd: als het goed is heb je ``postgresql-" "server-dev-all`` geïnstalleerd, tegelijkertijd met de databaseserver." -#: ../../installation.rst:254 +#: ../../installation.rst:342 msgid "Continue to chapter 8 (Bootstrapping)." msgstr "Ga door naar hoofdstuk 8 (Bootstrapping)." -#: ../../installation.rst:263 +#: ../../installation.rst:351 msgid "Or did you choose MySQL/MariaDB? Execute these two commands::" msgstr "Of heb je gekozen voor MySQL/MariaDB? Voer dan deze twee commando's uit::" -#: ../../installation.rst:269 +#: ../../installation.rst:357 msgid "" "Did everything install without fatal errors? If the database client refuses to " "install due to missing files/configs, make sure you've installed " @@ -518,11 +556,11 @@ msgstr "" "installatie het volgende hebt uitgevoerd: als het goed is heb je " "``libmysqlclient-dev`` geïnstalleerd, tegelijkertijd met de databaseserver." -#: ../../installation.rst:274 +#: ../../installation.rst:362 msgid "8. Bootstrapping" msgstr "8. Initialisatie" -#: ../../installation.rst:275 +#: ../../installation.rst:363 msgid "" "Now it's time to bootstrap the application and check whether all settings are " "good and requirements are met." @@ -530,11 +568,11 @@ msgstr "" "Tijd om te kijken of alles goed is ingesteld. We gaan de applicatie proberen te " "initialiseren." -#: ../../installation.rst:277 +#: ../../installation.rst:365 msgid "Execute this to initialize the database we've created earlier::" msgstr "Voer dit uit om de database te initialiseren::" -#: ../../installation.rst:281 +#: ../../installation.rst:369 msgid "" "Prepare static files for webinterface. This will copy all static files to the " "directory we created for Nginx earlier in the process. It allows us to have " @@ -545,11 +583,11 @@ msgstr "" "hebben aangemaakt. Het zorgt ervoor dat Nginx deze bestanden kan hosten buiten " "de code-bestanden." -#: ../../installation.rst:284 +#: ../../installation.rst:372 msgid "Sync static files::" msgstr "Synchroniseer statische bestanden::" -#: ../../installation.rst:288 +#: ../../installation.rst:376 msgid "" "Create an application superuser. Django will prompt you for a password. The " "credentials generated can be used to access the administration panel inside the " @@ -561,11 +599,11 @@ msgstr "" "applicatie gebruiken. Indien gewenst kun je een andere gebruikersnaam kiezen. " "Het e-mailadres maakt niet uit, want de applicatie ondersteunt toch geen e-mail." -#: ../../installation.rst:291 +#: ../../installation.rst:379 msgid "Create your user::" msgstr "Creëer je eigen gebruiker::" -#: ../../installation.rst:297 +#: ../../installation.rst:385 msgid "" "Because you have shell access you may reset your user's password at any time " "(in case you forget it). Just enter this for a password reset::" @@ -573,15 +611,15 @@ msgstr "" "Wachtwoord ooit vergeten? Via de command line kun je je wachtwoord (bij " "verlies) hiermee aanpassen::" -#: ../../installation.rst:301 +#: ../../installation.rst:389 msgid "You've almost completed the installation now." msgstr "Je bent op dit punt bijna klaar met de installatie." -#: ../../installation.rst:305 +#: ../../installation.rst:393 msgid "9. Webserver/Nginx (part 2)" msgstr "9. Webserver/Nginx (deel 2)" -#: ../../installation.rst:309 +#: ../../installation.rst:397 msgid "" "This installation guide asumes you run the Nginx webserver for this application " "only." @@ -589,7 +627,7 @@ msgstr "" "Deze installatiehandleiding gaat er vanuit dat je de Nginx webserver alleen " "gebruikt voor deze applicatie." -#: ../../installation.rst:311 +#: ../../installation.rst:399 msgid "" "It's possible to have other applications use Nginx as well, but that requires " "you to remove the wildcard in the ``dsmr-webinterface`` vhost, which you will " @@ -599,7 +637,7 @@ msgstr "" "daarvoor zul je de wildcard moet weghalen in de ``dsmr-webinterface`` vhost, " "die je hieronder kopieert." -#: ../../installation.rst:315 +#: ../../installation.rst:403 msgid "" "Remove the default Nginx vhost (**only when you do not use it yourself, see the " "note above**)::" @@ -607,7 +645,7 @@ msgstr "" "Verwijder de standaard vhost van Nginx **wanneer je deze niet zelf gebruikt** " "(zie de notitie hierboven)::" -#: ../../installation.rst:319 +#: ../../installation.rst:407 msgid "" "Copy application vhost, **it will listen to any hostname** (wildcard), but you " "may change that if you feel like you need to. It won't affect the application " @@ -616,18 +654,18 @@ msgstr "" "Kopieer de vhost voor de applicatie. Deze luistert standaard naar **elke " "hostname** (wildcard), maar dat is natuurlijk naar eigen wens aan te passen::" -#: ../../installation.rst:323 +#: ../../installation.rst:411 msgid "" "Let Nginx verify vhost syntax and reload Nginx when ``configtest`` passes::" msgstr "" "Laat Nginx controleren of je geen typefouten hebt gemaakt en herlaad Nginx " "vervolgens wanneer de ``configtest`` lukt::" -#: ../../installation.rst:332 +#: ../../installation.rst:420 msgid "10. Supervisor" msgstr "10. Supervisor" -#: ../../installation.rst:333 +#: ../../installation.rst:421 msgid "" "Now we configure `Supervisor `_, which is used to run " "our application's web interface and background jobs used. It's also configured " @@ -638,15 +676,15 @@ msgstr "" "Supervisor ervoor dat deze processen bij het (opnieuw) opstarten automatisch " "draaien." -#: ../../installation.rst:336 +#: ../../installation.rst:424 msgid "Copy the configuration file for Supervisor::" msgstr "Kopieer het configuratie-bestand voor Supervisor::" -#: ../../installation.rst:340 +#: ../../installation.rst:428 msgid "Login to ``supervisorctl`` management console::" msgstr "Wissel naar de ``supervisorctl`` beheerconsole::" -#: ../../installation.rst:344 +#: ../../installation.rst:432 msgid "" "Enter these commands (**listed after the** ``>``). It will ask Supervisor to " "recheck its config directory and use/reload the files::" @@ -654,7 +692,7 @@ msgstr "" "Voer de volgende commando's in (**degene na de** ``>``). Dit zorgt ervoor dat " "Supervisor zijn eigen configuratie opnieuw controleert en toepast::" -#: ../../installation.rst:350 +#: ../../installation.rst:438 msgid "" "Three processes should be started or running. Make sure they don't end up in " "``ERROR`` or ``BACKOFF`` state, so refresh with the ``status`` command a few " @@ -664,15 +702,15 @@ msgstr "" "uiteindelijk niet in ``ERROR`` of ``BACKOFF`` status terecht zijn gekomen. Je " "kunt het overzicht verversen door ``status`` te typen." -#: ../../installation.rst:352 +#: ../../installation.rst:440 msgid "When still in ``supervisorctl``'s console, type::" msgstr "Typ het volgende wanneer je nog in ``supervisorctl``'s console bent::" -#: ../../installation.rst:356 +#: ../../installation.rst:444 msgid "Example of everything running well::" msgstr "Voorbeeld van wanneer alles naar behoren draait::" -#: ../../installation.rst:362 +#: ../../installation.rst:450 msgid "" "Want to check whether the datalogger works? Just tail it's log in supervisor " "with::" @@ -680,7 +718,7 @@ msgstr "" "Wil je controleren of de datalogger zijn werk goed doet? Bekijk dan het " "logbestand in supervisor met::" -#: ../../installation.rst:366 +#: ../../installation.rst:454 msgid "" "You should see similar output as the ``cu``-command printed earlier in the " "installation process." @@ -688,7 +726,7 @@ msgstr "" "Uiteindelijk zou je ongeveer dezelfde lap tekst moeten zien als toen we " "handmatig gemeten hebben met het ``cu``-programma." -#: ../../installation.rst:368 +#: ../../installation.rst:456 msgid "" "Want to quit supervisor? ``CTRL + C`` to stop tailing and then ``CTRL + D`` " "once to exit supervisor command line." @@ -696,10 +734,27 @@ msgstr "" "Wil je uit supervisor? Druk dan op ``CTRL + C`` om het logbestand niet meer te " "bekijken en vervolgens op ``CTRL + D`` om uit supervisor te gaan." -#: ../../installation.rst:371 +#: ../../installation.rst:459 msgid "" "You now should have everything up and running! We're almost done and just need " "to do a few last things on the next page." msgstr "" "Alles zou nu moeten werken! We zijn bijna klaar, op een paar laatste dingen na " "in het volgende hoofdstuk." + +#~ msgid "Method B: Installation script" +#~ msgstr "Methode B: Installatiescript" + +#~ msgid "" +#~ "For quick installation. Use the latest installation script (only works for " +#~ "Raspbian)::" +#~ msgstr "" +#~ "Voor een snelle installatie. Gebruik het meest recente installatiescript " +#~ "(werkt alleen voor Raspbian)::" + +#~ msgid "" +#~ "Does it not work due to: \"bash: curl: command not found\"? Install cURL and " +#~ "try again: ``apt-get install curl``" +#~ msgstr "" +#~ "Werkt het niet wegens: \"bash: curl: command not found\"? Installeer dan " +#~ "cURL en probeer opnieuw: ``apt-get install curl`" diff --git a/docs/locale/nl/LC_MESSAGES/retention.mo b/docs/locale/nl/LC_MESSAGES/retention.mo index 3d9f0e7648e6885c1f220cce8ac7933a79e26584..1c6cab51e188fa8d1d30e9764896fc4ab58cd58d 100644 GIT binary patch delta 224 zcmXBN%L)Mj6b9g5lgqe^BuTR{VM@sZ*eJ2H@B&kg$;QYGg`%)jl(O{%R^uIH;c={N z{IUAZ9opj89X)tm-#h3XRa42kwoFXNk+Eh^w1F%| gv&53QjGgl*TFm?=LowaiR5Zh|Y4QLe8j#Kx zU=U-d1Txrwws`>Q1|Z!Gq)%@4Wcs*wYSdy8ar|Xhfl4_-3WMF8aYhb8r zXrf?fWMyimZD43%z!l)H8S&Utsv6X=lSlwn@&Ln2;%)H{{jKu8JoYcI@J9*^z Zi&9Hc^GY&P6|}U{^Yb$|zvfY81pokXIv)T4 diff --git a/docs/locale/nl/LC_MESSAGES/retention.po b/docs/locale/nl/LC_MESSAGES/retention.po index f5f545d6c..e88db84e8 100644 --- a/docs/locale/nl/LC_MESSAGES/retention.po +++ b/docs/locale/nl/LC_MESSAGES/retention.po @@ -41,9 +41,9 @@ msgid "" "it will **preserve the first and last reading of each hour**." msgstr "" "Uiteindelijk zorgt dit voor **slechtere performance** in ofwel de applicatie " -"of database. Daarom zul je wellicht retentie willen inschakelen. Let op: Het " -"inschakelen van retentie **gooi niet alle metingen weg**, want **van elk uur " -"wordt de eerste en laatste meting bewaard**." +"of database. Daarom zul je wellicht retentie willen toepassen op deze " +"gegevens. Let op: Het inschakelen van deze feature **gooit niet alle metingen " +"weg**, want **van elk uur wordt de eerste en laatste meting bewaard**." #: ../../retention.rst:14 msgid "Notes / warnings" diff --git a/dsmr_api/tests/v1/test_api.py b/dsmr_api/tests/v1/test_api.py index 67fe2b90e..55536c24d 100644 --- a/dsmr_api/tests/v1/test_api.py +++ b/dsmr_api/tests/v1/test_api.py @@ -2,7 +2,7 @@ from django.test.testcases import TestCase from django.test.client import Client -from django.core.urlresolvers import reverse +from django.urls import reverse from dsmr_api.models import APISettings from dsmr_datalogger.models.reading import DsmrReading diff --git a/dsmr_api/urls/__init__.py b/dsmr_api/urls/__init__.py index d50c22e62..e69de29bb 100644 --- a/dsmr_api/urls/__init__.py +++ b/dsmr_api/urls/__init__.py @@ -1,7 +0,0 @@ -from django.conf.urls import include, url - - -urlpatterns = [ - url(r'^v1/', include('dsmr_api.urls.v1', namespace='api-v1')), # Remote datalogger only. - url(r'^v2/', include('dsmr_api.urls.v2', namespace='api-v2')), # RESTful API. -] diff --git a/dsmr_api/urls/v1.py b/dsmr_api/urls/v1.py index e3a4afab6..a7d6ca9ae 100644 --- a/dsmr_api/urls/v1.py +++ b/dsmr_api/urls/v1.py @@ -4,6 +4,8 @@ from dsmr_api.views.v1 import DataloggerDsmrReading +app_name = 'api-v1' + urlpatterns = [ url(r'^datalogger/dsmrreading$', csrf_exempt(DataloggerDsmrReading.as_view()), name='datalogger-dsmrreading'), ] diff --git a/dsmr_api/urls/v2.py b/dsmr_api/urls/v2.py index 2e811c7c4..ae4c0efeb 100644 --- a/dsmr_api/urls/v2.py +++ b/dsmr_api/urls/v2.py @@ -3,6 +3,8 @@ from dsmr_api.views import v2 as views +app_name = 'api-v2' + datalogger_url_patterns = [ url(r'^dsmrreading$', views.DsmrReadingViewSet.as_view({ 'get': 'list', diff --git a/dsmr_backend/mixins.py b/dsmr_backend/mixins.py index c58b49699..79c4dabbf 100644 --- a/dsmr_backend/mixins.py +++ b/dsmr_backend/mixins.py @@ -6,6 +6,7 @@ from django.utils.translation import ugettext as _ from django.conf import settings from django.contrib import admin +from django.db import connection class InfiniteManagementCommandMixin(object): @@ -65,6 +66,10 @@ def handle(self, **options): self.stdout.write('') time.sleep(self.sleep_time) # Do not hammer. + # Check database connection after each run. This will force Django to reconnect as well, when having issues. + if settings.DSMRREADER_RECONNECT_DATABASE: + connection.close() + self.stdout.write('Exited due to signal detection') sys.exit(0) diff --git a/dsmr_backend/tests/mixins.py b/dsmr_backend/tests/mixins.py index 5dea7710d..d1c39f9f1 100644 --- a/dsmr_backend/tests/mixins.py +++ b/dsmr_backend/tests/mixins.py @@ -8,6 +8,6 @@ class InterceptStdoutMixin(object): def _intercept_command_stdout(self, command, **kwargs): stdout = StringIO() stderr = StringIO() # Only to mute. - call_command(command, stdout=stdout, stderr=stderr, run_once=True, **kwargs) + call_command(command, stdout=stdout, stderr=stderr, **kwargs) stdout.seek(0) return stdout.read() diff --git a/dsmr_backend/tests/test_backend.py b/dsmr_backend/tests/test_backend.py index f8b55b10b..0a702977d 100644 --- a/dsmr_backend/tests/test_backend.py +++ b/dsmr_backend/tests/test_backend.py @@ -12,7 +12,7 @@ class TestBackend(InterceptStdoutMixin, TestCase): def test_backend_creation_signal(self, signal_mock): """ Test outgoing signal. """ self.assertFalse(signal_mock.called) - self._intercept_command_stdout('dsmr_backend') + self._intercept_command_stdout('dsmr_backend', run_once=True) self.assertTrue(signal_mock.called) @mock.patch('dsmr_backup.services.backup.check') @@ -27,7 +27,7 @@ def test_backend_creation_signal_receivers(self, *mocks): for current in mocks: self.assertFalse(current.called) - self._intercept_command_stdout('dsmr_backend') + self._intercept_command_stdout('dsmr_backend', run_once=True) for current in mocks: self.assertTrue(current.called) @@ -53,7 +53,7 @@ def _fake_signal_troublemaker(*args, **kwargs): dsmr_backend.signals.backend_called.connect(receiver=_fake_signal_troublemaker) self.assertFalse(raven_mock.called) - self._intercept_command_stdout('dsmr_backend') + self._intercept_command_stdout('dsmr_backend', run_once=True) self.assertTrue(raven_mock.called) def test_supported_vendors(self): @@ -82,6 +82,6 @@ def test_pending_migrations(self): def test_internal_check(self): """ Tests whether Django passes it's internal 'check' command. """ self.assertEqual( - self._intercept_command_stdout('check', dry_run=True), + self._intercept_command_stdout('check'), 'System check identified no issues (0 silenced).\n', ) diff --git a/dsmr_datalogger/tests/datalogger/test_error.py b/dsmr_datalogger/tests/datalogger/test_error.py index 042f7e59a..0c4a5e5e6 100644 --- a/dsmr_datalogger/tests/datalogger/test_error.py +++ b/dsmr_datalogger/tests/datalogger/test_error.py @@ -58,7 +58,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): """ Fake & process an DSMR vX telegram reading. """ serial_open_mock.return_value = None serial_readline_mock.side_effect = self._dsmr_dummy_data() - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) def test_telegram_buffer_reset(self): """ Test whether an incomplete telegram gets dicarded. """ @@ -80,7 +80,7 @@ def test_interrupt(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = [eintr_error] + self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) # Everything else should be reraised. @@ -90,7 +90,7 @@ def test_interrupt(self, serial_readline_mock, serial_open_mock): self.assertFalse(DsmrReading.objects.exists()) with self.assertRaises(SerialException): - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertFalse(DsmrReading.objects.exists()) @@ -133,7 +133,7 @@ def test_fail(self, serial_readline_mock, serial_open_mock): self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertFalse(DsmrReading.objects.exists()) @@ -151,7 +151,7 @@ def test_okay(self, serial_readline_mock, serial_open_mock): self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) @@ -219,7 +219,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): @@ -311,7 +311,7 @@ def test_discard_telegram_with_future_timestamp(self, serial_readline_mock, seri datalogger_settings.save() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) # It should be discarded. self.assertFalse(DsmrReading.objects.exists()) diff --git a/dsmr_datalogger/tests/datalogger/test_generic.py b/dsmr_datalogger/tests/datalogger/test_generic.py index b6c8e0932..5bb9406e5 100644 --- a/dsmr_datalogger/tests/datalogger/test_generic.py +++ b/dsmr_datalogger/tests/datalogger/test_generic.py @@ -24,7 +24,7 @@ def test_tracking_disabled(self): # Datalogger should crash with error. with self.assertRaisesMessage(CommandError, 'Datalogger tracking is DISABLED!'): - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) class TestServices(TestCase): diff --git a/dsmr_datalogger/tests/datalogger/test_iskra.py b/dsmr_datalogger/tests/datalogger/test_iskra.py index 007a24fe7..051e77a75 100644 --- a/dsmr_datalogger/tests/datalogger/test_iskra.py +++ b/dsmr_datalogger/tests/datalogger/test_iskra.py @@ -51,7 +51,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): diff --git a/dsmr_datalogger/tests/datalogger/test_kaifa_dsmr42.py b/dsmr_datalogger/tests/datalogger/test_kaifa_dsmr42.py index fa436e5fc..ae68c246b 100644 --- a/dsmr_datalogger/tests/datalogger/test_kaifa_dsmr42.py +++ b/dsmr_datalogger/tests/datalogger/test_kaifa_dsmr42.py @@ -49,7 +49,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): diff --git a/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr40.py b/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr40.py index db948939d..a10d46424 100644 --- a/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr40.py +++ b/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr40.py @@ -63,7 +63,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_open_mock.return_value = None serial_readline_mock.side_effect = self._dsmr_dummy_data() - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): diff --git a/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr42.py b/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr42.py index a08b6a5af..a108386f5 100644 --- a/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr42.py +++ b/dsmr_datalogger/tests/datalogger/test_landisgyr350_dsmr42.py @@ -62,7 +62,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): diff --git a/dsmr_datalogger/tests/datalogger/test_landisgyr350_other_dsmr42.py b/dsmr_datalogger/tests/datalogger/test_landisgyr350_other_dsmr42.py index 6fd8c78a9..51965cfa5 100644 --- a/dsmr_datalogger/tests/datalogger/test_landisgyr350_other_dsmr42.py +++ b/dsmr_datalogger/tests/datalogger/test_landisgyr350_other_dsmr42.py @@ -52,7 +52,7 @@ def _fake_dsmr_reading(self, serial_readline_mock, serial_open_mock): serial_readline_mock.side_effect = self._dsmr_dummy_data() self.assertFalse(DsmrReading.objects.exists()) - self._intercept_command_stdout('dsmr_datalogger') + self._intercept_command_stdout('dsmr_datalogger', run_once=True) self.assertTrue(DsmrReading.objects.exists()) def test_reading_creation(self): diff --git a/dsmr_frontend/middleware/exception_traceback.py b/dsmr_frontend/middleware/exception_traceback.py index 0e96acbd6..13aad1c47 100644 --- a/dsmr_frontend/middleware/exception_traceback.py +++ b/dsmr_frontend/middleware/exception_traceback.py @@ -7,6 +7,20 @@ class ExceptionTracebackMiddleware(object): """ Handles any uncaught exceptions crashing the webinterface, and displays them. """ + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + # Code to be executed for each request before + # the view (and later middleware) are called. + + response = self.get_response(request) + + # Code to be executed for each request/response after + # the view is called. + + return response + def process_exception(self, request, exception): if settings.DEBUG: # Default exception handling, which is already nice when in DEBUG mode. diff --git a/dsmr_frontend/templates/dsmr_frontend/statistics.html b/dsmr_frontend/templates/dsmr_frontend/statistics.html index 1989d77f2..6250380d7 100644 --- a/dsmr_frontend/templates/dsmr_frontend/statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/statistics.html @@ -40,6 +40,14 @@ {{ latest_reading.electricity_delivered_2|default:'-' }} {% if capabilities.electricity_returned %}{{ latest_reading.electricity_returned_2|default:'-' }}{% endif %} + {% if latest_reading and delivered_sum %} + + {% trans "Electricity (tariffs combined)" %} + {{ delivered_sum|default:'-' }} + {% if capabilities.electricity_returned %}{{ returned_sum|default:'-' }}{% endif %} + + {% endif %} + {% if capabilities.gas %} {% trans "Gas " %} diff --git a/dsmr_frontend/tests/regression/test_dashboard_energysupplierprice_matching.py b/dsmr_frontend/tests/regression/test_dashboard_energysupplierprice_matching.py index aa7f51b7b..c9e3e0464 100644 --- a/dsmr_frontend/tests/regression/test_dashboard_energysupplierprice_matching.py +++ b/dsmr_frontend/tests/regression/test_dashboard_energysupplierprice_matching.py @@ -1,5 +1,5 @@ from django.test import TestCase, Client -from django.core.urlresolvers import reverse +from django.urls import reverse class TestRegression(TestCase): diff --git a/dsmr_frontend/tests/regression/test_dashboard_reverse_dashboard_graphs.py b/dsmr_frontend/tests/regression/test_dashboard_reverse_dashboard_graphs.py index ba55bb8e9..ceb3c8dc8 100644 --- a/dsmr_frontend/tests/regression/test_dashboard_reverse_dashboard_graphs.py +++ b/dsmr_frontend/tests/regression/test_dashboard_reverse_dashboard_graphs.py @@ -2,7 +2,7 @@ import json from django.test import TestCase, Client -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/regression/test_renamed_docs_reverse_url.py b/dsmr_frontend/tests/regression/test_renamed_docs_reverse_url.py index 1788e9588..4db6a2528 100644 --- a/dsmr_frontend/tests/regression/test_renamed_docs_reverse_url.py +++ b/dsmr_frontend/tests/regression/test_renamed_docs_reverse_url.py @@ -1,6 +1,6 @@ from django.db.migrations.executor import MigrationExecutor from django.db.migrations.recorder import MigrationRecorder -from django.core.urlresolvers import reverse +from django.urls import reverse from django.test import TestCase, Client from django.db import connection from django.apps import apps diff --git a/dsmr_frontend/tests/webinterface/test_archive.py b/dsmr_frontend/tests/webinterface/test_archive.py index 05b2cca44..89093e1d5 100644 --- a/dsmr_frontend/tests/webinterface/test_archive.py +++ b/dsmr_frontend/tests/webinterface/test_archive.py @@ -3,7 +3,7 @@ from django.test import TestCase, Client from django.utils import timezone, formats -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/webinterface/test_compare.py b/dsmr_frontend/tests/webinterface/test_compare.py index 820e4d7d3..6d7974deb 100644 --- a/dsmr_frontend/tests/webinterface/test_compare.py +++ b/dsmr_frontend/tests/webinterface/test_compare.py @@ -2,7 +2,7 @@ from django.test import TestCase, Client from django.utils import timezone -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/webinterface/test_dashboard.py b/dsmr_frontend/tests/webinterface/test_dashboard.py index 03d9a98b9..f5630ad27 100644 --- a/dsmr_frontend/tests/webinterface/test_dashboard.py +++ b/dsmr_frontend/tests/webinterface/test_dashboard.py @@ -3,7 +3,7 @@ from django.test import TestCase, Client from django.utils import timezone -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from django.db.models import F diff --git a/dsmr_frontend/tests/webinterface/test_export.py b/dsmr_frontend/tests/webinterface/test_export.py index 2bb5e73d5..429a83b29 100644 --- a/dsmr_frontend/tests/webinterface/test_export.py +++ b/dsmr_frontend/tests/webinterface/test_export.py @@ -1,7 +1,7 @@ import io from django.test import TestCase, Client -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/webinterface/test_generic.py b/dsmr_frontend/tests/webinterface/test_generic.py index 34d3c912e..ebe12ec69 100644 --- a/dsmr_frontend/tests/webinterface/test_generic.py +++ b/dsmr_frontend/tests/webinterface/test_generic.py @@ -1,7 +1,7 @@ from unittest import mock from django.test import TestCase, Client -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/webinterface/test_statistics.py b/dsmr_frontend/tests/webinterface/test_statistics.py index e28230464..d9cf9122c 100644 --- a/dsmr_frontend/tests/webinterface/test_statistics.py +++ b/dsmr_frontend/tests/webinterface/test_statistics.py @@ -1,9 +1,10 @@ from unittest import mock +from decimal import Decimal import json from django.test import TestCase, Client from django.utils import timezone -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption @@ -42,6 +43,10 @@ def test_statistics(self, now_mock): if DsmrReading.objects.exists(): self.assertIn('latest_reading', response.context) + self.assertIn('delivered_sum', response.context) + self.assertIn('returned_sum', response.context) + self.assertEqual(response.context['delivered_sum'], Decimal('1059.250')) + self.assertEqual(response.context['returned_sum'], Decimal('124.356')) def test_statistics_xhr_data(self): response = self.client.get( diff --git a/dsmr_frontend/tests/webinterface/test_status.py b/dsmr_frontend/tests/webinterface/test_status.py index c2495589c..90e5dddc5 100644 --- a/dsmr_frontend/tests/webinterface/test_status.py +++ b/dsmr_frontend/tests/webinterface/test_status.py @@ -3,7 +3,7 @@ from django.test import TestCase, Client from django.utils import timezone -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/tests/webinterface/test_trends.py b/dsmr_frontend/tests/webinterface/test_trends.py index 2c9eeda8e..0fa3fe5d8 100644 --- a/dsmr_frontend/tests/webinterface/test_trends.py +++ b/dsmr_frontend/tests/webinterface/test_trends.py @@ -2,7 +2,7 @@ from django.test import TestCase, Client from django.utils import timezone -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption diff --git a/dsmr_frontend/urls.py b/dsmr_frontend/urls.py index c7a3a55e8..5d00a8fcc 100644 --- a/dsmr_frontend/urls.py +++ b/dsmr_frontend/urls.py @@ -13,6 +13,8 @@ from dsmr_frontend.views.generic import DocsRedirect, FeedbackRedirect +app_name = 'frontend' + urlpatterns = [ # Public views. url(r'^$', Dashboard.as_view(), name='dashboard'), diff --git a/dsmr_frontend/views/export.py b/dsmr_frontend/views/export.py index e5e69ab43..17766ed4d 100644 --- a/dsmr_frontend/views/export.py +++ b/dsmr_frontend/views/export.py @@ -5,7 +5,7 @@ from django.http.response import StreamingHttpResponse from django.views.generic.base import TemplateView from django.views.generic.edit import BaseFormView -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone, formats from django.shortcuts import redirect diff --git a/dsmr_frontend/views/statistics.py b/dsmr_frontend/views/statistics.py index 45075f771..788860bfb 100644 --- a/dsmr_frontend/views/statistics.py +++ b/dsmr_frontend/views/statistics.py @@ -21,9 +21,15 @@ def get_context_data(self, **kwargs): context_data['capabilities'] = dsmr_backend.services.get_capabilities() try: - context_data['latest_reading'] = DsmrReading.objects.all().order_by('-pk')[0] + latest_reading = DsmrReading.objects.all().order_by('-pk')[0] except IndexError: pass + else: + context_data['latest_reading'] = latest_reading + context_data['delivered_sum'] = latest_reading.electricity_delivered_1 + \ + latest_reading.electricity_delivered_2 + context_data['returned_sum'] = latest_reading.electricity_returned_1 + \ + latest_reading.electricity_returned_2 today = timezone.localtime(timezone.now()).date() context_data['datalogger_settings'] = DataloggerSettings.get_solo() diff --git a/dsmr_stats/tests/models/test_notes.py b/dsmr_stats/tests/models/test_notes.py index 677cc1542..c29738571 100644 --- a/dsmr_stats/tests/models/test_notes.py +++ b/dsmr_stats/tests/models/test_notes.py @@ -2,7 +2,7 @@ from django.test.client import Client from django.contrib.admin.sites import site from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils import timezone from dsmr_stats.models.note import Note diff --git a/dsmr_weather/services.py b/dsmr_weather/services.py index 13552a55d..54373559b 100644 --- a/dsmr_weather/services.py +++ b/dsmr_weather/services.py @@ -63,7 +63,7 @@ def read_weather(): try: TemperatureReading.objects.create(read_at=read_at, degrees_celcius=Decimal(temperature)) - except: + except Exception: # Try again in 5 minutes. weather_settings.next_sync = timezone.now() + timezone.timedelta(minutes=5) else: diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 725574bf2..9ceae6041 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 12, 0, 'final', 0) +VERSION = (1, 13, 0, 'final', 0) __version__ = get_version(VERSION) diff --git a/dsmrreader/config/base.py b/dsmrreader/config/base.py index 9faf426fb..1701cdb98 100644 --- a/dsmrreader/config/base.py +++ b/dsmrreader/config/base.py @@ -66,13 +66,15 @@ 'dsmr_pvoutput.apps.AppConfig', ) -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( + # Debug toolbar. + 'debug_toolbar.middleware.DebugToolbarMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.security.SecurityMiddleware', @@ -204,3 +206,6 @@ # Whether telegrams are logged, in base64 format. Only required for debugging. DSMRREADER_LOG_TELEGRAMS = False + +# Whether the backend process (and datalogger) reconnects to the DB after each run. +DSMRREADER_RECONNECT_DATABASE = True diff --git a/dsmrreader/config/development.py b/dsmrreader/config/development.py index e61810a4a..b5e3a9e78 100644 --- a/dsmrreader/config/development.py +++ b/dsmrreader/config/development.py @@ -38,8 +38,6 @@ DEBUG_TOOLBAR_PATCH_SETTINGS = False -MIDDLEWARE_CLASSES = list(MIDDLEWARE_CLASSES) -MIDDLEWARE_CLASSES.insert(0, 'debug_toolbar.middleware.DebugToolbarMiddleware') INTERNAL_IPS = '127.0.0.1' ALLOWED_HOSTS = ['*'] diff --git a/dsmrreader/config/production.py b/dsmrreader/config/production.py index 43bae52bc..9c760474c 100644 --- a/dsmrreader/config/production.py +++ b/dsmrreader/config/production.py @@ -53,3 +53,10 @@ }, }, } + + +# Disable Django Toolbar. +MIDDLEWARE = list(MIDDLEWARE) +MIDDLEWARE.remove('debug_toolbar.middleware.DebugToolbarMiddleware') + +INTERNAL_IPS = None diff --git a/dsmrreader/config/test/base.py b/dsmrreader/config/test/base.py index 09692baa3..4e854f344 100644 --- a/dsmrreader/config/test/base.py +++ b/dsmrreader/config/test/base.py @@ -16,11 +16,11 @@ } -# Disable DDT. +# Disable Django Toolbar. INSTALLED_APPS = list(INSTALLED_APPS) INSTALLED_APPS.remove('debug_toolbar') -MIDDLEWARE_CLASSES = list(MIDDLEWARE_CLASSES) -MIDDLEWARE_CLASSES.remove('debug_toolbar.middleware.DebugToolbarMiddleware') +MIDDLEWARE = list(MIDDLEWARE) +MIDDLEWARE.remove('debug_toolbar.middleware.DebugToolbarMiddleware') INTERNAL_IPS = None diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index 7cab8939e932b71577ca1af1b87dfbbb12aa7487..24c7943bff7daf6996dd078891f3b5d0b9d7be73 100644 GIT binary patch delta 9864 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 delta 9811 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