Commit Graph

76 Commits

Author SHA1 Message Date
Aina Sitraka
f736eddc0f PHRAS-3704 Phrasea Rendition by Phraseanet worker (#4098)
* add verify ssl

* add info in webhook payload on subdef create

* reset cache of list of subdef for a record when create new subdef
2022-07-19 10:43:15 +02:00
Nicolas Maillat
bdcbd7c0e0 Revert " "PHRAS-3215 : Revert add ThumbnailOrientation facet ; add strings"" 2022-03-08 11:49:36 +01:00
Nicolas Maillat
ccd460be27 Revert "PHRAS-3215 : add ThumbnailOrientation facet ; add strings" 2022-02-25 23:10:23 +01:00
jygaulier
406a0ce953 PHRAS-3602 : add ThumbnailOrientation facet ; add strings 2022-02-25 10:11:49 +01:00
jygaulier
0fceee0471 PHRAS-3519_filesystem-atomic-move : remove delay
remove delay to subdef->isStillAccessible() calling fs->exists().
because it's called by getsubdef(), any missing subdef will slow down phr by 10s. on every getsubdef() call.
2021-11-24 18:40:01 +01:00
jygaulier
d1d5873463 Merge branch 'master' into PHRAS-3519_filesystem-atomic-move 2021-10-18 11:10:51 +02:00
Nicolas Maillat
b0abd5d54f Merge branch 'master' into PHRAS-3544_invalidate-stamp 2021-10-15 16:36:44 +02:00
jygaulier
4158f37029 PHRAS-3519_filesystem-atomic-move
implement retry delay for fs->exists(); used by subdef access.
2021-10-12 13:48:28 +02:00
aynsix
569a1b4dcf fix 2021-10-06 14:53:26 +03:00
jygaulier
8a29dc8c0d PHRAS-3544_invalidate-stamp
move delete to subdef class
2021-10-06 11:44:09 +02:00
aynsix
2891364458 change etag after rotation 2021-10-06 10:40:24 +03:00
jygaulier
d887b3b137 PHRAS-3544_invalidate-stamp
delete stamp cache file after image rotation or build subdef
2021-10-05 20:03:57 +02:00
aina-esokia
158e3eb2df port fix preview pdf in pdfjs 2019-01-10 18:29:47 +04:00
Sandeep
3c9e875ea9 PHRAS-1911 refactor technical fields list 2018-03-19 15:00:21 +04:00
Sandeep
5de988299d PHRAS-1911-add route return list documentary fields 2018-03-16 15:01:20 +04:00
Thibaud Fabre
d00d674cdf Fix document substitution 2016-11-24 17:21:11 +01:00
Benoît Burnichon
fca3146f91 Remove subdef etag when marking physically unavailable 2016-04-22 17:07:18 +02:00
Benoît Burnichon
f84f625a4e All media_subdef updates go to the repository 2016-04-22 16:15:37 +02:00
Benoît Burnichon
1e18b3e69f This is a combination of 33 commits.
- Squashed Pull request #1730
- Squashed Pull request #1741
- Squashed Pull request #1742
- Squash merge branch 4.0
- Squashed Pull request #1744
- Squashed Pull request #1746
- Squashed merge branch 4.0
- Squashed merge branch 4.0
- Squashed merge branch 4.0
- Squashed merge branch 4.0
- Squashed Pull request #1758
- Avoid using imagine/imagine alias as it is causing install issues
- Squashed merge branch 4.0
- Squashed Pull request #1763
- Squashed merge branch 4.0
- Squash of 6 commits
- Squashed merge branch 4.0
- This is a combination of 2 commits.
- Squashed Pull request #1775
- Squashed Pull request #1777
- Squashed Pull request #1779
- Squashed Pull request #1780
- Squashed Pull request #1782
- Adds a Pull request template
- Squased Pull request #1783
- Squash Pull request #1786
- Squashed Pull request #1796
- Squashed merge branch 4.0
- Squash Pull request #1791
- Squashed merge branch 4.0
- Squashed Pull request #1808
- Squashed Pull request #1811
- Squashed Pull request #1809
2016-04-20 16:22:14 +02:00
Jean-Yves Gaulier
e6b1ad4f2f PHRAS-1055 #time 1h
- no bug concerning --max_record
- add try/catch so the job don't stop on errors

PHRAS-1055 #time 5h
- add option --dry
- add verbose print (-v)
- add "ALL" for type and subdef arguments
- fix "substitute" options
- fix show sql with arguments

PHRAS-1055 #time 5h
- better error handling
- argument "databox" can be specified as id, dbname or viewname
- add option "--partition=n/N"
- argument "type" changed to option "--record_type=a,b,c" (can also be set as "--record_type=a,b --record_type=c")
- argument "subdefs" changed to option "--name=x,y,z" (can also be set as "--name=x,y --name=z")
- option "--with-substitution" changed to "--with_substituted"
- option "--substitution-only" changed to "--substituted-only"

PHRAS-1055 #time 2h
- change lone argument (databox) to option "--databox" (mandatory)
- add option "--missing_only" to create missing subdefs after structure change.
- add option "--garbage_collect" to remove orphan subdefs left by structure change.

PHRAS-1055 #time 1m
- cleanup

PHRAS-1055 #time 2h
- cleanup
- add option "--reset_subdef_flag"
- add option "--set_writemeta_flag"

PHRAS-1055 #time 1m
- fix vocabulary (flag)
2016-04-06 11:36:00 +02:00
Benoît Burnichon
fae284d482 media_subdef could sometimes be constructed without a proper URL
Introduced by #1626
2016-02-05 15:36:19 +01:00
Benoît Burnichon
614394edc7 Method renaming 2016-01-26 14:25:08 +01:00
Benoît Burnichon
3838fc6faf Add watermark and stamp related RealPath retrieval methods 2016-01-26 14:25:08 +01:00
Benoît Burnichon
b9a8f1e82a Properly initialize media_subdef 2016-01-13 13:22:17 +01:00
Benoît Burnichon
606995115c PHPCS 2016-01-13 13:20:56 +01:00
Benoît Burnichon
51023c5533 bump copyright year 2016-01-05 13:38:14 +01:00
Jean-Yves Gaulier
80f3285737 #PHRAS-874 time 2d
type hinting / cs
events renamed / deleted
n+1 removed for status-bits & technical meta
events added (subdef creation / created)
fix : es indexes after all subdefs are created
2015-12-17 20:07:48 +01:00
Jean-Yves Gaulier
18909462fa #PHRAS-840 time 12h
add : es "technical" fields (_index, _type, _version, ...) to es-record
fix: add etag to thumbnail on es answers, based on document _version
clean : obsolete methods calls changed, cs, ...
2015-12-10 17:58:16 +01:00
Florian BLOUET
0e97e4a0ae moved skins/icon to assets/common/images/icons 2015-12-02 17:35:37 +01:00
Mathieu Darse
5c82e384ac Enable collecting of GPS position references (North, South, East, West) 2015-11-13 10:28:57 +01:00
Benoît Burnichon
c97eedd40f Deprecate is_grouping in favor of isStory 2015-07-13 18:14:51 +02:00
Benoît Burnichon
4241fd0e6c WIP with cache 2015-06-10 19:09:38 +02:00
Benoît Burnichon
4db591a12a PHPCS fixing and avoid returns in some constructors 2015-05-07 11:04:45 +02:00
Nicolas Le Goff
ed3ffb59a6 Merge remote-tracking branch 'upstream/master' into 20150306-elastic-indexer
Conflicts:
	bin/console
	bower.json
	composer.json
	composer.lock
	lib/Alchemy/Phrasea/Application.php
	lib/Alchemy/Phrasea/Border/Manager.php
	lib/Alchemy/Phrasea/Controller/Api/V1.php
	lib/Alchemy/Phrasea/Core/PhraseaEvents.php
	lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php
	lib/classes/caption/field.php
	lib/classes/record/Interface.php
	templates/web/prod/index.html.twig
	www/skins/prod/000000/prodcolor.css
2015-03-10 14:36:31 +01:00
Nicolas Le Goff
a3ef1b606c Makes static thumbnails delivery as default delivery && set symlink dir in www directory 2015-02-16 15:01:44 +01:00
Nicolas Le Goff
949bf06cac Merge branch '3.8'
Conflicts:
	CHANGELOG.md
	bin/console
	bin/developer
	bin/setup
	bower.json
	composer.json
	composer.lock
	features/bootstrap/FeatureContext.php
	features/bootstrap/GuiContext.php
	lib/Alchemy/Phrasea/Authentication/Token/TokenValidator.php
	lib/Alchemy/Phrasea/Command/BuildMissingSubdefs.php
	lib/Alchemy/Phrasea/Command/CreateCollection.php
	lib/Alchemy/Phrasea/Command/Developer/JavascriptBuilder.php
	lib/Alchemy/Phrasea/Controller/Admin/Collection.php
	lib/Alchemy/Phrasea/Controller/Admin/Databoxes.php
	lib/Alchemy/Phrasea/Controller/Admin/TaskManager.php
	lib/Alchemy/Phrasea/Controller/Api/V1.php
	lib/Alchemy/Phrasea/Controller/Client/Baskets.php
	lib/Alchemy/Phrasea/Controller/Client/Root.php
	lib/Alchemy/Phrasea/Controller/Prod/Basket.php
	lib/Alchemy/Phrasea/Controller/Prod/Export.php
	lib/Alchemy/Phrasea/Controller/Prod/Property.php
	lib/Alchemy/Phrasea/Controller/Prod/Records.php
	lib/Alchemy/Phrasea/Controller/Prod/Tools.php
	lib/Alchemy/Phrasea/Controller/Prod/Upload.php
	lib/Alchemy/Phrasea/Controller/Root/Login.php
	lib/Alchemy/Phrasea/Controller/Thesaurus/Thesaurus.php
	lib/Alchemy/Phrasea/Core/Event/ApiLoadEndEvent.php
	lib/Alchemy/Phrasea/Core/Event/ApiLoadStartEvent.php
	lib/Alchemy/Phrasea/Core/Provider/TaskManagerServiceProvider.php
	lib/Alchemy/Phrasea/Core/Version.php
	lib/Alchemy/Phrasea/Exception/XMLParseErrorException.php
	lib/Alchemy/Phrasea/Helper/DatabaseHelper.php
	lib/Alchemy/Phrasea/Helper/User/Edit.php
	lib/Alchemy/Phrasea/SearchEngine/Phrasea/PhraseaEngine.php
	lib/Alchemy/Phrasea/SearchEngine/SearchEngineOptions.php
	lib/Doctrine/Entities/AuthFailure.php
	lib/Doctrine/Entities/Basket.php
	lib/Doctrine/Entities/BasketElement.php
	lib/Doctrine/Entities/LazaretAttribute.php
	lib/Doctrine/Entities/LazaretCheck.php
	lib/Doctrine/Entities/LazaretFile.php
	lib/Doctrine/Entities/LazaretSession.php
	lib/Doctrine/Entities/Session.php
	lib/Doctrine/Entities/SessionModule.php
	lib/Doctrine/Entities/StoryWZ.php
	lib/Doctrine/Entities/UsrList.php
	lib/Doctrine/Entities/UsrListEntry.php
	lib/Doctrine/Entities/UsrListOwner.php
	lib/Doctrine/Entities/ValidationData.php
	lib/Doctrine/Entities/ValidationParticipant.php
	lib/Doctrine/Entities/ValidationSession.php
	lib/Doctrine/Logger/MonologSQLLogger.php
	lib/Doctrine/Repositories/BasketRepository.php
	lib/Doctrine/Repositories/ValidationParticipantRepository.php
	lib/Doctrine/Types/Binary.php
	lib/Doctrine/Types/Blob.php
	lib/Doctrine/Types/Enum.php
	lib/Doctrine/Types/LongBlob.php
	lib/Doctrine/Types/VarBinary.php
	lib/classes/API/OAuth2/Account.php
	lib/classes/API/OAuth2/Application.php
	lib/classes/API/OAuth2/Application/OfficePlugin.php
	lib/classes/API/OAuth2/AuthCode.php
	lib/classes/API/OAuth2/RefreshToken.php
	lib/classes/API/OAuth2/Token.php
	lib/classes/API/V1/Abstract.php
	lib/classes/API/V1/Interface.php
	lib/classes/API/V1/adapter.php
	lib/classes/API/V1/exception/abstract.php
	lib/classes/API/V1/exception/badrequest.php
	lib/classes/API/V1/exception/forbidden.php
	lib/classes/API/V1/exception/internalservererror.php
	lib/classes/API/V1/exception/maintenance.php
	lib/classes/API/V1/exception/methodnotallowed.php
	lib/classes/API/V1/exception/notfound.php
	lib/classes/API/V1/exception/unauthorized.php
	lib/classes/API/V1/result.php
	lib/classes/Exception/Feed/EntryNotFound.php
	lib/classes/Exception/Feed/ItemNotFound.php
	lib/classes/Exception/Feed/PublisherNotFound.php
	lib/classes/Feed/Abstract.php
	lib/classes/Feed/Adapter.php
	lib/classes/Feed/Aggregate.php
	lib/classes/Feed/Collection.php
	lib/classes/Feed/CollectionInterface.php
	lib/classes/Feed/Entry/Adapter.php
	lib/classes/Feed/Entry/Collection.php
	lib/classes/Feed/Entry/CollectionInterface.php
	lib/classes/Feed/Entry/Interface.php
	lib/classes/Feed/Entry/Item.php
	lib/classes/Feed/Entry/ItemInterface.php
	lib/classes/Feed/Interface.php
	lib/classes/Feed/Link.php
	lib/classes/Feed/LinkInterface.php
	lib/classes/Feed/Publisher/Adapter.php
	lib/classes/Feed/Publisher/Interface.php
	lib/classes/Feed/Token.php
	lib/classes/Feed/TokenAggregate.php
	lib/classes/Feed/XML/Abstract.php
	lib/classes/Feed/XML/Atom.php
	lib/classes/Feed/XML/Cooliris.php
	lib/classes/Feed/XML/Interface.php
	lib/classes/Feed/XML/RSS.php
	lib/classes/Feed/XML/RSS/Image.php
	lib/classes/Feed/XML/RSS/ImageInterface.php
	lib/classes/User/Adapter.php
	lib/classes/User/Interface.php
	lib/classes/appbox/register.php
	lib/classes/connection.php
	lib/classes/connection/abstract.php
	lib/classes/connection/interface.php
	lib/classes/connection/pdo.php
	lib/classes/connection/pdoStatementDebugger.php
	lib/classes/deprecated/countries.php
	lib/classes/deprecated/inscript.api.php
	lib/classes/eventsmanager/event/test.php
	lib/classes/ftpclient.php
	lib/classes/http/request.php
	lib/classes/media/subdef.php
	lib/classes/module/console/schedulerStart.php
	lib/classes/module/console/schedulerState.php
	lib/classes/module/console/schedulerStop.php
	lib/classes/module/console/taskState.php
	lib/classes/module/console/tasklist.php
	lib/classes/module/console/taskrun.php
	lib/classes/patch/320alpha4b.php
	lib/classes/patch/3715alpha1a.php
	lib/classes/patch/379alpha1a.php
	lib/classes/patch/380alpha10a.php
	lib/classes/patch/380alpha11a.php
	lib/classes/patch/380alpha13a.php
	lib/classes/patch/380alpha14a.php
	lib/classes/patch/380alpha15a.php
	lib/classes/patch/380alpha16a.php
	lib/classes/patch/380alpha17a.php
	lib/classes/patch/380alpha18a.php
	lib/classes/patch/380alpha3a.php
	lib/classes/patch/380alpha4a.php
	lib/classes/patch/380alpha6a.php
	lib/classes/patch/380alpha8a.php
	lib/classes/patch/380alpha9a.php
	lib/classes/patch/381alpha1b.php
	lib/classes/patch/381alpha2a.php
	lib/classes/patch/381alpha3a.php
	lib/classes/patch/381alpha4a.php
	lib/classes/patch/383alpha1a.php
	lib/classes/patch/383alpha2a.php
	lib/classes/patch/383alpha3a.php
	lib/classes/patch/383alpha4a.php
	lib/classes/record/adapter.php
	lib/classes/record/preview.php
	lib/classes/recordutils.php
	lib/classes/recordutils/audio.php
	lib/classes/recordutils/document.php
	lib/classes/recordutils/map.php
	lib/classes/recordutils/video.php
	lib/classes/registry.php
	lib/classes/registryInterface.php
	lib/classes/set/order.php
	lib/classes/system/url.php
	lib/classes/task/Scheduler.php
	lib/classes/task/appboxAbstract.php
	lib/classes/task/databoxAbstract.php
	lib/classes/task/manager.php
	lib/classes/task/period/RecordMover.php
	lib/classes/task/period/apibridge.php
	lib/classes/task/period/apiwebhooks.php
	lib/classes/task/period/archive.php
	lib/classes/task/period/cindexer.php
	lib/classes/task/period/emptyColl.php
	lib/classes/task/period/ftp.php
	lib/classes/task/period/ftpPull.php
	lib/classes/task/period/subdef.php
	lib/classes/task/period/test.php
	lib/classes/task/period/writemeta.php
	lib/conf.d/PhraseaFixture/AbstractWZ.php
	lib/conf.d/PhraseaFixture/Basket/LoadFiveBaskets.php
	lib/conf.d/PhraseaFixture/Basket/LoadOneBasket.php
	lib/conf.d/PhraseaFixture/Basket/LoadOneBasketEnv.php
	lib/conf.d/PhraseaFixture/Lazaret/LoadOneFile.php
	lib/conf.d/PhraseaFixture/Story/LoadOneStory.php
	lib/conf.d/PhraseaFixture/UsrLists/ListAbstract.php
	lib/conf.d/PhraseaFixture/UsrLists/UsrList.php
	lib/conf.d/PhraseaFixture/UsrLists/UsrListEntry.php
	lib/conf.d/PhraseaFixture/UsrLists/UsrListOwner.php
	lib/conf.d/PhraseaFixture/ValidationParticipant/LoadOneParticipant.php
	lib/conf.d/PhraseaFixture/ValidationParticipant/LoadParticipantWithSession.php
	lib/conf.d/PhraseaFixture/ValidationSession/LoadOneValidationSession.php
	templates/web/admin/collection/collection.html.twig
	templates/web/common/dialog_export.html.twig
	templates/web/common/menubar.html.twig
	templates/web/prod/actions/Tools/index.html.twig
	templates/web/prod/index.html.twig
	templates/web/prod/upload/upload-flash.html.twig
	templates/web/prod/upload/upload.html.twig
	templates/web/report/report_layout_child.html.twig
	templates/web/setup/step2.html.twig
	templates/web/thesaurus/new-synonym-dialog.html.twig
	templates/web/thesaurus/properties.html.twig
	templates/web/thesaurus/search.html.twig
	tests/Alchemy/Tests/Phrasea/Application/ApiAbstract.php
	tests/Alchemy/Tests/Phrasea/Cache/FactoryTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Admin/AdminCollectionTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Client/RootTest.php
2015-02-05 18:38:49 +01:00
Jean-Yves Gaulier
138008f7c6 #PHRAS-325 #time 5h
fix "substit" flag in subdef.

new api route /embed/substitute
parms :
- databox_id
- record_id
- name
- /file/

more properties returned by api / object "embed" :
- substituted
- created_on
- updated_on
2015-01-29 19:55:24 +01:00
Nicolas Le Goff
d82adbf109 Bump year to 2015 2015-01-20 14:08:25 +01:00
Nicolas Le Goff
8c6434cca0 Fix etag property hydratation 2015-01-14 16:51:45 +01:00
Nicolas Le Goff
75f65a2b99 Add etag parameter to invalidatebrowser cache 2015-01-13 15:54:07 +01:00
Nicolas Le Goff
e6c5c8e10e Fix sha1_file perf issue 2015-01-06 12:54:30 +01:00
Nicolas Le Goff
589169299c Fix merge 3.8 2014-12-09 14:01:00 +01:00
Nicolas Le Goff
9f38823f27 Merge branch '3.8'
Conflicts:
	composer.lock
	lib/Alchemy/Phrasea/Application.php
	lib/Alchemy/Phrasea/Command/Setup/H264MappingGenerator.php
	lib/Alchemy/Phrasea/Controller/AbstractDelivery.php
	lib/Alchemy/Phrasea/Controller/Prod/DoDownload.php
	lib/Alchemy/Phrasea/Controller/Prod/Edit.php
	lib/Alchemy/Phrasea/Controller/Prod/Story.php
	lib/Alchemy/Phrasea/Controller/Prod/Upload.php
	lib/Alchemy/Phrasea/Controller/Report/Activity.php
	lib/Alchemy/Phrasea/Controller/Report/Root.php
	lib/Alchemy/Phrasea/Controller/Root/Account.php
	lib/Alchemy/Phrasea/Core/PhraseaEvents.php
	lib/Alchemy/Phrasea/Core/Version.php
	lib/classes/API/V1/adapter.php
	lib/classes/User/Adapter.php
	lib/classes/databox.php
	lib/classes/media/subdef.php
	lib/classes/module/report.php
	lib/classes/module/report/activity.php
	lib/classes/module/report/connexion.php
	lib/classes/module/report/download.php
	lib/classes/module/report/nav.php
	lib/classes/module/report/question.php
	lib/classes/module/report/sqlaction.php
	lib/classes/module/report/sqlconnexion.php
	lib/classes/module/report/sqldownload.php
	lib/classes/module/report/sqlfilter.php
	lib/classes/task/abstract.php
	locale/de_DE/LC_MESSAGES/phraseanet.mo
	locale/de_DE/LC_MESSAGES/phraseanet.po
	locale/en_GB/LC_MESSAGES/phraseanet.mo
	locale/en_GB/LC_MESSAGES/phraseanet.po
	locale/fr_FR/LC_MESSAGES/phraseanet.mo
	locale/fr_FR/LC_MESSAGES/phraseanet.po
	locale/nl_NL/LC_MESSAGES/phraseanet.mo
	locale/nl_NL/LC_MESSAGES/phraseanet.po
	locale/phraseanet.pot
	templates/web/prod/index.html.twig
	tests/Alchemy/Tests/Phrasea/Application/ApiAbstract.php
	tests/classes/api/v1/api_v1_adapterTest.php
	tests/classes/report/activityTest.php
	tests/classes/report/editTest.php
2014-12-09 13:59:29 +01:00
Nicolas Le Goff
419509de68 Remove the use of old record_interface interface 2014-12-04 11:48:08 +01:00
Nicolas Le Goff
616337db33 Fix dump calculation 2014-11-26 00:19:18 +01:00
Nicolas Le Goff
4b5a1d79fb Fix etags calculation 2014-11-21 14:55:10 +01:00
Nicolas Le Goff
68af5b3391 Returns 304 http code if images are not modified 2014-11-21 10:36:52 +01:00
Nicolas Le Goff
10a83bc6c4 Fix latest merge 2014-10-13 12:58:20 +02:00
Nicolas Le Goff
28eecf6a09 Merge branch '3.8'
Conflicts:
	.gitignore
	bin/console
	composer.json
	composer.lock
	hudson/fixtures.sql
	lib/Alchemy/Phrasea/Command/Developer/IniReset.php
	lib/Alchemy/Phrasea/Command/Setup/Install.php
	lib/Alchemy/Phrasea/Controller/Api/Oauth2.php
	lib/Alchemy/Phrasea/Controller/Api/V1.php
	lib/Alchemy/Phrasea/Controller/Prod/Export.php
	lib/Alchemy/Phrasea/Controller/Root/Login.php
	lib/Alchemy/Phrasea/Core/Provider/PhraseanetServiceProvider.php
	lib/Alchemy/Phrasea/Core/Version.php
	lib/Alchemy/Phrasea/Helper/DatabaseHelper.php
	lib/Alchemy/Phrasea/Helper/Prod.php
	lib/classes/API/OAuth2/Application.php
	lib/classes/API/V1/Interface.php
	lib/classes/API/V1/adapter.php
	lib/classes/Setup/Upgrade.php
	lib/classes/media/subdef.php
	lib/classes/task/period/RecordMover.php
	templates/web/prod/index.html.twig
	templates/web/setup/step2.html.twig
	tests/Alchemy/Tests/Phrasea/Controller/Admin/RootTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Root/LoginTest.php
	tests/classes/api/v1/api_v1_adapterTest.php
	tests/db-ref.sqlite
	vagrant/vms/phraseanet-php54-nginx/puphpet/config.yaml
	vagrant/vms/phraseanet-php54-nginx/puphpet/files/exec-once/setup
2014-10-09 19:40:33 +02:00
Nicolas Le Goff
2c6ba6b99f Add static file mode to deliver thumbnails 2014-09-10 11:23:29 +02:00