diff --git a/.gitignore b/.gitignore index fa563fa..2a12fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ /vendor/ /bin/ /composer.phar +app/calcifer.sqlite3 \ No newline at end of file diff --git a/README.md b/README.md index e44be2b..efc478d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Calcifer Terminverwaltung +[![Join the chat at https://gitter.im/HackspaceJena/calcifer](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/HackspaceJena/calcifer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + Calcifer ist ein Daemon aus dem Anime [Howl no Ugoku Shiro](http://anidb.net/perl-bin/animedb.pl?show=anime&aid=1218), der sich darum kümmert das sich Howls Schloss weiter bewegt. Diese Terminverwaltung soll dafür sorgen das sich der [Hackspace Jena](https://www.krautspace.de/) auch weiter bewegt und viele tolle Termine statfinden. Das [offizielle Repository](https://phablab.krautspace.de/diffusion/C/) für diese Software findet man auf der Phabrictator-Instanz des Hackspaces. Für Leute die lieber auf Github stehen wurde ein Mirror unter [https://github.com/HackspaceJena/calcifer](https://github.com/HackspaceJena/calcifer) eingerichtet. \ No newline at end of file diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php index 56bd35d..cbcf1c8 100644 --- a/app/SymfonyRequirements.php +++ b/app/SymfonyRequirements.php @@ -117,16 +117,16 @@ class PhpIniRequirement extends Requirement /** * Constructor that initializes the requirement. * - * @param string $cfgName The configuration name used for ini_get() - * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, - or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. - This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. - Example: You require a config to be true but PHP later removes this config and defaults it to true internally. - * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) - * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) - * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) - * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement */ public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) { @@ -219,15 +219,15 @@ class RequirementCollection implements IteratorAggregate /** * Adds a mandatory requirement in form of a php.ini configuration. * - * @param string $cfgName The configuration name used for ini_get() - * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, - or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. - This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. - Example: You require a config to be true but PHP later removes this config and defaults it to true internally. - * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) - * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) - * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) */ public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) { @@ -237,15 +237,15 @@ class RequirementCollection implements IteratorAggregate /** * Adds an optional recommendation in form of a php.ini configuration. * - * @param string $cfgName The configuration name used for ini_get() - * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, - or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param string $cfgName The configuration name used for ini_get() + * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. - This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. - Example: You require a config to be true but PHP later removes this config and defaults it to true internally. - * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) - * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) - * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) + * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) */ public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) { @@ -440,8 +440,8 @@ class SymfonyRequirements extends RequirementCollection } $this->addRequirement( - isset($timezones[date_default_timezone_get()]), - sprintf('Configured default timezone "%s" must be supported by your installation of PHP', date_default_timezone_get()), + isset($timezones[@date_default_timezone_get()]), + sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.' ); } @@ -530,6 +530,16 @@ class SymfonyRequirements extends RequirementCollection 'Install the PCRE extension (version 8.0+).' ); + if (extension_loaded('mbstring')) { + $this->addPhpIniRequirement( + 'mbstring.func_overload', + create_function('$cfgValue', 'return (int) $cfgValue === 0;'), + true, + 'string functions should not be overloaded', + 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.' + ); + } + /* optional recommendations follow */ $this->addRecommendation( @@ -580,8 +590,8 @@ class SymfonyRequirements extends RequirementCollection $this->addRecommendation( class_exists('DomDocument'), - 'PHP-XML module should be installed', - 'Install and enable the PHP-XML module.' + 'PHP-DOM and PHP-XML modules should be installed', + 'Install and enable the PHP-DOM and the PHP-XML modules.' ); $this->addRecommendation( @@ -672,10 +682,8 @@ class SymfonyRequirements extends RequirementCollection ); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $this->addPhpIniRecommendation( - 'realpath_cache_size', - create_function('$cfgValue', 'return (int) $cfgValue > 1000;'), - false, + $this->addRecommendation( + $this->getRealpathCacheSize() > 1000, 'realpath_cache_size should be above 1024 in php.ini', 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' ); @@ -704,4 +712,28 @@ class SymfonyRequirements extends RequirementCollection ); } } + + /** + * Loads realpath_cache_size from php.ini and converts it to int. + * + * (e.g. 16k is converted to 16384 int) + * + * @return int + */ + protected function getRealpathCacheSize() + { + $size = ini_get('realpath_cache_size'); + $size = trim($size); + $unit = strtolower(substr($size, -1, 1)); + switch ($unit) { + case 'g': + return $size * 1024 * 1024 * 1024; + case 'm': + return $size * 1024 * 1024; + case 'k': + return $size * 1024; + default: + return (int) $size; + } + } } diff --git a/app/check.php b/app/check.php index bb0a20e..90bad4a 100644 --- a/app/check.php +++ b/app/check.php @@ -110,7 +110,7 @@ function echo_style($style, $message) ); $supports = has_color_support(); - echo ($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); + echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); } function echo_block($style, $title, $message) diff --git a/composer.json b/composer.json index 12f7112..0c99e08 100755 --- a/composer.json +++ b/composer.json @@ -33,11 +33,12 @@ "incenteev/composer-parameter-handler": "~2.0", "jquery/jquery": "1.10.*", "knplabs/knp-markdown-bundle": "~1.3", - "enko/ics": "~0.1", + "enko/ics": "~0.2", "doctrine/migrations": "dev-master", "doctrine/doctrine-migrations-bundle": "dev-master", "jbroadway/urlify" : "~1.0", - "enko/relativedateparser" : "v0.3" + "enko/relativedateparser" : "v0.5", + "sabre/dav" : "~2.0" }, "require-dev": { "sensio/generator-bundle": "~2.3" diff --git a/composer.lock b/composer.lock index ba7ddf7..0186f76 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "76317aae6b4148c72d1d1afc039502d9", + "hash": "6771cfbdeebb8bc4a8a5ca0071bbf312", "packages": [ { "name": "doctrine/annotations", - "version": "v1.2.1", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "6a6bec0670bb6e71a263b08bc1b98ea242928633" + "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/6a6bec0670bb6e71a263b08bc1b98ea242928633", - "reference": "6a6bec0670bb6e71a263b08bc1b98ea242928633", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/eeda578cbe24a170331a1cfdf78be723412df7a4", + "reference": "eeda578cbe24a170331a1cfdf78be723412df7a4", "shasum": "" }, "require": { @@ -72,20 +72,20 @@ "docblock", "parser" ], - "time": "2014-09-25 16:45:30" + "time": "2014-12-20 20:49:38" }, { "name": "doctrine/cache", - "version": "v1.3.1", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "cf483685798a72c93bf4206e3dd6358ea07d64e7" + "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/cf483685798a72c93bf4206e3dd6358ea07d64e7", - "reference": "cf483685798a72c93bf4206e3dd6358ea07d64e7", + "url": "https://api.github.com/repos/doctrine/cache/zipball/2346085d2b027b233ae1d5de59b07440b9f288c8", + "reference": "2346085d2b027b233ae1d5de59b07440b9f288c8", "shasum": "" }, "require": { @@ -96,6 +96,7 @@ }, "require-dev": { "phpunit/phpunit": ">=3.7", + "predis/predis": "~0.8", "satooshi/php-coveralls": "~0.6" }, "type": "library", @@ -141,7 +142,7 @@ "cache", "caching" ], - "time": "2014-09-17 14:24:04" + "time": "2015-01-15 20:38:55" }, { "name": "doctrine/collections", @@ -291,30 +292,38 @@ }, { "name": "doctrine/dbal", - "version": "v2.4.2", + "version": "v2.5.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "fec965d330c958e175c39e61c3f6751955af32d0" + "reference": "628c2256b646ae2417d44e063bce8aec5199d48d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/fec965d330c958e175c39e61c3f6751955af32d0", - "reference": "fec965d330c958e175c39e61c3f6751955af32d0", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d", + "reference": "628c2256b646ae2417d44e063bce8aec5199d48d", "shasum": "" }, "require": { - "doctrine/common": "~2.4", + "doctrine/common": ">=2.4,<2.6-dev", "php": ">=5.3.2" }, "require-dev": { - "phpunit/phpunit": "3.7.*", - "symfony/console": "~2.0" + "phpunit/phpunit": "4.*", + "symfony/console": "2.*" }, "suggest": { - "symfony/console": "Allows use of the command line interface" + "symfony/console": "For helpful console commands such as SQL execution and import of files." }, + "bin": [ + "bin/doctrine-dbal" + ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.5.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\DBAL\\": "lib/" @@ -325,17 +334,6 @@ "MIT" ], "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -343,6 +341,14 @@ { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" } ], "description": "Database Abstraction Layer", @@ -353,34 +359,37 @@ "persistence", "queryobject" ], - "time": "2014-01-01 16:43:57" + "time": "2015-01-12 21:52:47" }, { "name": "doctrine/doctrine-bundle", - "version": "v1.2.0", - "target-dir": "Doctrine/Bundle/DoctrineBundle", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "765b0d87fcc3e839c74817b7211258cbef3a4fb9" + "reference": "1986ff3a945b584c6505d07eae92d77e41131078" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/765b0d87fcc3e839c74817b7211258cbef3a4fb9", - "reference": "765b0d87fcc3e839c74817b7211258cbef3a4fb9", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/1986ff3a945b584c6505d07eae92d77e41131078", + "reference": "1986ff3a945b584c6505d07eae92d77e41131078", "shasum": "" }, "require": { - "doctrine/dbal": ">=2.2,<2.5-dev", + "doctrine/dbal": "~2.3", + "doctrine/doctrine-cache-bundle": "~1.0", "jdorn/sql-formatter": "~1.1", "php": ">=5.3.2", "symfony/doctrine-bridge": "~2.2", - "symfony/framework-bundle": "~2.2" + "symfony/framework-bundle": "~2.3" }, "require-dev": { - "doctrine/orm": ">=2.2,<2.5-dev", + "doctrine/orm": "~2.3", + "phpunit/phpunit": "~4", + "satooshi/php-coveralls": "~0.6.1", "symfony/validator": "~2.2", - "symfony/yaml": "~2.2" + "symfony/yaml": "~2.2", + "twig/twig": "~1.10" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -389,12 +398,12 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.4.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Bundle\\DoctrineBundle": "" + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -402,12 +411,6 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" @@ -415,6 +418,14 @@ { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony DoctrineBundle", @@ -425,7 +436,91 @@ "orm", "persistence" ], - "time": "2013-03-25 20:13:59" + "time": "2015-02-28 11:04:45" + }, + { + "name": "doctrine/doctrine-cache-bundle", + "version": "v1.0.1", + "target-dir": "Doctrine/Bundle/DoctrineCacheBundle", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineCacheBundle.git", + "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", + "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", + "shasum": "" + }, + "require": { + "doctrine/cache": "~1.3", + "doctrine/inflector": "~1.0", + "php": ">=5.3.2", + "symfony/doctrine-bridge": "~2.2", + "symfony/framework-bundle": "~2.2", + "symfony/security": "~2.2" + }, + "require-dev": { + "instaclick/coding-standard": "~1.1", + "instaclick/object-calisthenics-sniffs": "dev-master", + "instaclick/symfony2-coding-standard": "dev-remaster", + "phpunit/phpunit": "~3.7", + "satooshi/php-coveralls": "~0.6.1", + "squizlabs/php_codesniffer": "dev-master", + "symfony/console": "~2.2", + "symfony/finder": "~2.2", + "symfony/validator": "~2.2", + "symfony/yaml": "~2.2" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Bundle\\DoctrineCacheBundle": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Fabio B. Silva", + "email": "fabio.bat.silva@gmail.com" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@hotmail.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Symfony2 Bundle for Doctrine Cache", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "cache", + "caching" + ], + "time": "2014-11-28 09:43:36" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -434,12 +529,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "81575a4316951125ce408c70f30547c77d98f78a" + "reference": "6a1bd731dbdd4ad952a3b246a8f38c9c12f52e62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/81575a4316951125ce408c70f30547c77d98f78a", - "reference": "81575a4316951125ce408c70f30547c77d98f78a", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/6a1bd731dbdd4ad952a3b246a8f38c9c12f52e62", + "reference": "6a1bd731dbdd4ad952a3b246a8f38c9c12f52e62", "shasum": "" }, "require": { @@ -484,26 +579,34 @@ "migrations", "schema" ], - "time": "2014-08-17 07:53:47" + "time": "2015-02-16 13:24:46" }, { "name": "doctrine/inflector", - "version": "v1.0", + "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "54b8333d2a5682afdc690060c1cf384ba9f47f08" + "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/54b8333d2a5682afdc690060c1cf384ba9f47f08", - "reference": "54b8333d2a5682afdc690060c1cf384ba9f47f08", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604", + "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604", "shasum": "" }, "require": { "php": ">=5.3.2" }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Inflector\\": "lib/" @@ -514,17 +617,6 @@ "MIT" ], "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, { "name": "Roman Borschel", "email": "roman@code-factory.org" @@ -533,41 +625,52 @@ "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, { "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "http://jmsyst.com", - "role": "Developer of wrapped JMSSerializerBundle" + "email": "schmittjoh@gmail.com" } ], "description": "Common String Manipulations with regard to casing and singular/plural rules.", "homepage": "http://www.doctrine-project.org", "keywords": [ "inflection", - "pluarlize", - "singuarlize", + "pluralize", + "singularize", "string" ], - "time": "2013-01-10 21:49:15" + "time": "2014-12-20 21:24:13" }, { "name": "doctrine/lexer", - "version": "v1.0", + "version": "v1.0.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "2f708a85bb3aab5d99dab8be435abd73e0b18acb" + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/2f708a85bb3aab5d99dab8be435abd73e0b18acb", - "reference": "2f708a85bb3aab5d99dab8be435abd73e0b18acb", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", + "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", "shasum": "" }, "require": { "php": ">=5.3.2" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" @@ -578,20 +681,17 @@ "MIT" ], "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, { "name": "Roman Borschel", "email": "roman@code-factory.org" }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, { "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "http://jmsyst.com", - "role": "Developer of wrapped JMSSerializerBundle" + "email": "schmittjoh@gmail.com" } ], "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", @@ -600,7 +700,7 @@ "lexer", "parser" ], - "time": "2013-01-12 18:59:04" + "time": "2014-09-09 13:34:57" }, { "name": "doctrine/migrations", @@ -608,12 +708,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021" + "reference": "1e3f9f86a0f171df25be1946120a2a54d42db4d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", - "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1e3f9f86a0f171df25be1946120a2a54d42db4d5", + "reference": "1e3f9f86a0f171df25be1946120a2a54d42db4d5", "shasum": "" }, "require": { @@ -640,7 +740,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL" + "LGPL-2.1" ], "authors": [ { @@ -658,20 +758,20 @@ "database", "migrations" ], - "time": "2014-08-18 18:03:07" + "time": "2015-03-20 13:06:33" }, { "name": "doctrine/orm", - "version": "v2.4.5", + "version": "v2.4.7", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "c0d3cdbdfbf873871167050ab077e49b1ad02ab0" + "reference": "2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/c0d3cdbdfbf873871167050ab077e49b1ad02ab0", - "reference": "c0d3cdbdfbf873871167050ab077e49b1ad02ab0", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68", + "reference": "2bc4ff3cab2ae297bcd05f2e619d42e6a7ca9e68", "shasum": "" }, "require": { @@ -731,20 +831,20 @@ "database", "orm" ], - "time": "2014-09-22 21:58:51" + "time": "2014-12-16 13:45:01" }, { "name": "enko/ics", - "version": "0.1.0", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/enko/ICS.git", - "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32" + "reference": "2c1905ca62c6fb49a026cd965b591b6209787109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/enko/ICS/zipball/60416fc3842a7b4ee4f0938b8c35c96b402fee32", - "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32", + "url": "https://api.github.com/repos/enko/ICS/zipball/2c1905ca62c6fb49a026cd965b591b6209787109", + "reference": "2c1905ca62c6fb49a026cd965b591b6209787109", "shasum": "" }, "require": { @@ -783,7 +883,7 @@ "ical", "multi-byte safe" ], - "time": "2014-07-30 23:43:46" + "time": "2014-11-22 16:07:40" }, { "name": "enko/relativedateparser", @@ -878,16 +978,16 @@ }, { "name": "jbroadway/urlify", - "version": "1.0.3-stable", + "version": "1.0.4-stable", "source": { "type": "git", "url": "https://github.com/jbroadway/urlify.git", - "reference": "c9ada9d3873d11f72fa772aecd6896efad11ee67" + "reference": "1a47f32e3eb70391f5a56efb139ad6a3ca45f1ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jbroadway/urlify/zipball/c9ada9d3873d11f72fa772aecd6896efad11ee67", - "reference": "c9ada9d3873d11f72fa772aecd6896efad11ee67", + "url": "https://api.github.com/repos/jbroadway/urlify/zipball/1a47f32e3eb70391f5a56efb139ad6a3ca45f1ab", + "reference": "1a47f32e3eb70391f5a56efb139ad6a3ca45f1ab", "shasum": "" }, "require": { @@ -906,14 +1006,13 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD" ], "authors": [ { "name": "Johnny Broadway", "email": "johnny@johnnybroadway.com", - "homepage": "http://www.johnnybroadway.com/", - "role": "Main Developer" + "homepage": "http://www.johnnybroadway.com/" } ], "description": "PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.", @@ -929,7 +1028,7 @@ "url", "urlify" ], - "time": "2014-03-17 16:14:04" + "time": "2015-03-09 22:33:47" }, { "name": "jdorn/sql-formatter", @@ -1053,16 +1152,16 @@ }, { "name": "kriswallsmith/assetic", - "version": "v1.1.2", + "version": "v1.2.1", "source": { "type": "git", "url": "https://github.com/kriswallsmith/assetic.git", - "reference": "735cffd3982c6e8cdebe292d5db39d077f65890f" + "reference": "b20efe38845d20458702f97f3ff625d80805897b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/735cffd3982c6e8cdebe292d5db39d077f65890f", - "reference": "735cffd3982c6e8cdebe292d5db39d077f65890f", + "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/b20efe38845d20458702f97f3ff625d80805897b", + "reference": "b20efe38845d20458702f97f3ff625d80805897b", "shasum": "" }, "require": { @@ -1077,7 +1176,9 @@ "leafo/scssphp": "*", "leafo/scssphp-compass": "*", "mrclay/minify": "*", - "phpunit/phpunit": "~3.7", + "patchwork/jsqueeze": "~1.0", + "phpunit/phpunit": "~4", + "psr/log": "~1.0", "ptachoire/cssembed": "*", "twig/twig": "~1.6" }, @@ -1085,13 +1186,14 @@ "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", + "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", "twig/twig": "Assetic provides the integration with the Twig templating engine" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "1.2-dev" } }, "autoload": { @@ -1120,7 +1222,7 @@ "compression", "minification" ], - "time": "2013-07-19 00:03:27" + "time": "2014-12-12 05:04:05" }, { "name": "michelf/php-markdown", @@ -1175,16 +1277,16 @@ }, { "name": "monolog/monolog", - "version": "1.11.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa" + "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", - "reference": "ec3961874c43840e96da3a8a1ed20d8c73d7e5aa", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c31a2c4e8db5da8b46c74cf275d7f109c0f249ac", + "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac", "shasum": "" }, "require": { @@ -1198,9 +1300,10 @@ "aws/aws-sdk-php": "~2.4, >2.4.8", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", - "phpunit/phpunit": "~3.7.0", + "phpunit/phpunit": "~4.0", "raven/raven": "~0.5", "ruflin/elastica": "0.90.*", + "swiftmailer/swiftmailer": "~5.3", "videlalvaro/php-amqplib": "~2.4" }, "suggest": { @@ -1217,7 +1320,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.13.x-dev" } }, "autoload": { @@ -1243,7 +1346,7 @@ "logging", "psr-3" ], - "time": "2014-09-30 13:30:58" + "time": "2015-03-09 09:58:04" }, { "name": "psr/log", @@ -1283,31 +1386,276 @@ ], "time": "2012-12-21 11:40:51" }, + { + "name": "sabre/dav", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/fruux/sabre-dav.git", + "reference": "6a8aec204688d36681e0185fbaf1974b97e4a070" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/6a8aec204688d36681e0185fbaf1974b97e4a070", + "reference": "6a8aec204688d36681e0185fbaf1974b97e4a070", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-date": "*", + "ext-dom": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "ext-spl": "*", + "php": ">=5.4.1", + "sabre/event": "~2.0.0", + "sabre/http": "~3.0.0", + "sabre/vobject": "~3.3" + }, + "require-dev": { + "evert/phpdoc-md": "~0.1.0", + "phpunit/phpunit": "~4.2", + "squizlabs/php_codesniffer": "~1.5.3" + }, + "suggest": { + "ext-curl": "*", + "ext-pdo": "*" + }, + "bin": [ + "bin/sabredav", + "bin/naturalselection" + ], + "type": "library", + "autoload": { + "psr-4": { + "Sabre\\DAV\\": "lib/DAV/", + "Sabre\\DAVACL\\": "lib/DAVACL/", + "Sabre\\CalDAV\\": "lib/CalDAV/", + "Sabre\\CardDAV\\": "lib/CardDAV/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "WebDAV Framework for PHP", + "homepage": "http://sabre.io/", + "keywords": [ + "CalDAV", + "CardDAV", + "WebDAV", + "framework", + "iCalendar" + ], + "time": "2015-02-25 18:13:20" + }, + { + "name": "sabre/event", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/fruux/sabre-event.git", + "reference": "f33d60742d7dff63d3722d0f70016704bf32e8db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruux/sabre-event/zipball/f33d60742d7dff63d3722d0f70016704bf32e8db", + "reference": "f33d60742d7dff63d3722d0f70016704bf32e8db", + "shasum": "" + }, + "require": { + "php": ">=5.4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabre\\Event\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "sabre/event is a library for lightweight event-based programming", + "homepage": "http://sabre.io/event/", + "keywords": [ + "EventEmitter", + "events", + "hooks", + "plugin", + "promise", + "signal" + ], + "time": "2014-10-06 23:26:48" + }, + { + "name": "sabre/http", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/fruux/sabre-http.git", + "reference": "efae5aa7155ba73aa517e33c20aba9c001bb6588" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruux/sabre-http/zipball/efae5aa7155ba73aa517e33c20aba9c001bb6588", + "reference": "efae5aa7155ba73aa517e33c20aba9c001bb6588", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4", + "sabre/event": ">=1.0.0,<3.0.0" + }, + "require-dev": { + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "~1.5.3" + }, + "suggest": { + "ext-curl": " to make http requests with the Client class" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabre\\HTTP\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + } + ], + "description": "The sabre/http library provides utilities for dealing with http requests and responses. ", + "homepage": "https://github.com/fruux/sabre-http", + "keywords": [ + "http" + ], + "time": "2014-12-10 20:14:39" + }, + { + "name": "sabre/vobject", + "version": "3.4.2", + "source": { + "type": "git", + "url": "https://github.com/fruux/sabre-vobject.git", + "reference": "0c90f60dae40137f1903c7b5915d3691c4fc99b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/0c90f60dae40137f1903c7b5915d3691c4fc99b0", + "reference": "0c90f60dae40137f1903c7b5915d3691c4fc99b0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "*", + "squizlabs/php_codesniffer": "*" + }, + "bin": [ + "bin/vobject", + "bin/generate_vcards" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabre\\VObject\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Evert Pot", + "email": "me@evertpot.com", + "homepage": "http://evertpot.com/", + "role": "Developer" + }, + { + "name": "Dominik Tobschall", + "email": "dominik@fruux.com", + "homepage": "http://tobschall.de/", + "role": "Developer" + } + ], + "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects", + "homepage": "http://sabre.io/vobject/", + "keywords": [ + "VObject", + "iCalendar", + "jCal", + "jCard", + "vCard" + ], + "time": "2015-02-25 17:47:50" + }, { "name": "sensio/distribution-bundle", - "version": "v3.0.6", + "version": "v3.0.18", "target-dir": "Sensio/Bundle/DistributionBundle", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "e20461e4f8e1afd68f36cf90bdccc06f7aa6a6c2" + "reference": "ac026149ffb1d3a5c893290d2d3ca8795013de08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/e20461e4f8e1afd68f36cf90bdccc06f7aa6a6c2", - "reference": "e20461e4f8e1afd68f36cf90bdccc06f7aa6a6c2", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ac026149ffb1d3a5c893290d2d3ca8795013de08", + "reference": "ac026149ffb1d3a5c893290d2d3ca8795013de08", "shasum": "" }, "require": { "php": ">=5.3.3", "sensiolabs/security-checker": "~2.0", "symfony/class-loader": "~2.2", + "symfony/framework-bundle": "~2.3", + "symfony/process": "~2.2" + }, + "require-dev": { "symfony/form": "~2.2", - "symfony/framework-bundle": "~2.4", - "symfony/process": "~2.2", "symfony/validator": "~2.2", "symfony/yaml": "~2.2" }, + "suggest": { + "symfony/form": "If you want to use the configurator", + "symfony/validator": "If you want to use the configurator", + "symfony/yaml": "If you want to use the configurator" + }, "type": "symfony-bundle", "extra": { "branch-alias": { @@ -1334,21 +1682,21 @@ "configuration", "distribution" ], - "time": "2014-09-24 14:47:46" + "time": "2015-02-27 12:59:18" }, { "name": "sensio/framework-extra-bundle", - "version": "v3.0.2", + "version": "v3.0.5", "target-dir": "Sensio/Bundle/FrameworkExtraBundle", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", - "reference": "9b22aaee517e80aad3238ea0328458b6f964066f" + "reference": "a72ce75a73d86c3593eceed5650b58fd3807a0cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/9b22aaee517e80aad3238ea0328458b6f964066f", - "reference": "9b22aaee517e80aad3238ea0328458b6f964066f", + "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/a72ce75a73d86c3593eceed5650b58fd3807a0cf", + "reference": "a72ce75a73d86c3593eceed5650b58fd3807a0cf", "shasum": "" }, "require": { @@ -1389,20 +1737,20 @@ "annotations", "controllers" ], - "time": "2014-09-02 07:11:30" + "time": "2015-02-05 07:39:23" }, { "name": "sensiolabs/security-checker", - "version": "v2.0.0", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/sensiolabs/security-checker.git", - "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee" + "reference": "134cecf1c61256bd8e973e11376891a724543820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", - "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/134cecf1c61256bd8e973e11376891a724543820", + "reference": "134cecf1c61256bd8e973e11376891a724543820", "shasum": "" }, "require": { @@ -1434,24 +1782,24 @@ } ], "description": "A security checker for your composer.lock", - "time": "2014-07-19 10:52:35" + "time": "2015-01-26 16:25:19" }, { "name": "swiftmailer/swiftmailer", - "version": "v5.2.2", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "e02f71a35436af4bd58a1bd90116089e632e29e1" + "reference": "31454f258f10329ae7c48763eb898a75c39e0a9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/e02f71a35436af4bd58a1bd90116089e632e29e1", - "reference": "e02f71a35436af4bd58a1bd90116089e632e29e1", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/31454f258f10329ae7c48763eb898a75c39e0a9f", + "reference": "31454f258f10329ae7c48763eb898a75c39e0a9f", "shasum": "" }, "require": { - "php": ">=5.2.4" + "php": ">=5.3.3" }, "require-dev": { "mockery/mockery": "~0.9.1" @@ -1459,7 +1807,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.2-dev" + "dev-master": "5.4-dev" } }, "autoload": { @@ -1486,49 +1834,51 @@ "mail", "mailer" ], - "time": "2014-09-20 07:17:36" + "time": "2015-03-14 06:06:39" }, { "name": "symfony/assetic-bundle", - "version": "v2.3.0", - "target-dir": "Symfony/Bundle/AsseticBundle", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/symfony/AsseticBundle.git", - "reference": "146dd3cb46b302bd471560471c6aaa930483dac1" + "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/146dd3cb46b302bd471560471c6aaa930483dac1", - "reference": "146dd3cb46b302bd471560471c6aaa930483dac1", + "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/422b0add2110f0cf9bc7a873a386ea053f4a89f0", + "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0", "shasum": "" }, "require": { - "kriswallsmith/assetic": "~1.1", + "kriswallsmith/assetic": "~1.2", "php": ">=5.3.0", - "symfony/framework-bundle": "~2.1" + "symfony/console": "~2.3", + "symfony/dependency-injection": "~2.3", + "symfony/framework-bundle": "~2.3", + "symfony/yaml": "~2.3" }, "require-dev": { - "symfony/class-loader": "~2.1", - "symfony/console": "~2.1", - "symfony/css-selector": "~2.1", - "symfony/dom-crawler": "~2.1", - "symfony/form": "~2.1", - "symfony/twig-bundle": "~2.1", - "symfony/yaml": "~2.1" + "kriswallsmith/spork": "~0.2", + "patchwork/jsqueeze": "~1.0", + "symfony/class-loader": "~2.3", + "symfony/css-selector": "~2.3", + "symfony/dom-crawler": "~2.3", + "symfony/twig-bundle": "~2.3" }, "suggest": { - "symfony/twig-bundle": "~2.1" + "kriswallsmith/spork": "to be able to dump assets in parallel", + "symfony/twig-bundle": "to use the Twig integration" }, "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "2.5-dev" } }, "autoload": { - "psr-0": { - "Symfony\\Bundle\\AsseticBundle": "" + "psr-4": { + "Symfony\\Bundle\\AsseticBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1549,69 +1899,20 @@ "compression", "minification" ], - "time": "2013-05-16 05:32:23" - }, - { - "name": "symfony/icu", - "version": "v1.2.2", - "target-dir": "Symfony/Component/Icu", - "source": { - "type": "git", - "url": "https://github.com/symfony/Icu.git", - "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Icu/zipball/d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", - "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", - "shasum": "" - }, - "require": { - "ext-intl": "*", - "lib-icu": ">=4.4", - "php": ">=5.3.3", - "symfony/intl": "~2.3" - }, - "type": "library", - "autoload": { - "psr-0": { - "Symfony\\Component\\Icu\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Contains an excerpt of the ICU data and classes to load it.", - "homepage": "http://symfony.com", - "keywords": [ - "icu", - "intl" - ], - "time": "2014-07-25 09:58:17" + "time": "2015-01-27 12:45:16" }, { "name": "symfony/monolog-bundle", - "version": "v2.6.1", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/MonologBundle.git", - "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a" + "reference": "9320b6863404c70ebe111e9040dab96f251de7ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/227bbeefe30f2d95e3fe5fbd1ccda414287a957a", - "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a", + "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/9320b6863404c70ebe111e9040dab96f251de7ac", + "reference": "9320b6863404c70ebe111e9040dab96f251de7ac", "shasum": "" }, "require": { @@ -1629,7 +1930,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.7.x-dev" } }, "autoload": { @@ -1657,21 +1958,20 @@ "log", "logging" ], - "time": "2014-07-21 00:36:06" + "time": "2015-01-04 20:21:17" }, { "name": "symfony/swiftmailer-bundle", - "version": "v2.3.7", - "target-dir": "Symfony/Bundle/SwiftmailerBundle", + "version": "v2.3.8", "source": { "type": "git", "url": "https://github.com/symfony/SwiftmailerBundle.git", - "reference": "e98defd402f72e8b54a029ba4d3ac4cb51dc3577" + "reference": "970b13d01871207e81d17b17ddda025e7e21e797" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/SwiftmailerBundle/zipball/e98defd402f72e8b54a029ba4d3ac4cb51dc3577", - "reference": "e98defd402f72e8b54a029ba4d3ac4cb51dc3577", + "url": "https://api.github.com/repos/symfony/SwiftmailerBundle/zipball/970b13d01871207e81d17b17ddda025e7e21e797", + "reference": "970b13d01871207e81d17b17ddda025e7e21e797", "shasum": "" }, "require": { @@ -1685,6 +1985,9 @@ "symfony/http-kernel": "~2.1", "symfony/yaml": "~2.1" }, + "suggest": { + "psr/log": "Allows logging" + }, "type": "symfony-bundle", "extra": { "branch-alias": { @@ -1692,8 +1995,8 @@ } }, "autoload": { - "psr-0": { - "Symfony\\Bundle\\SwiftmailerBundle": "" + "psr-4": { + "Symfony\\Bundle\\SwiftmailerBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1701,41 +2004,38 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony SwiftmailerBundle", "homepage": "http://symfony.com", - "time": "2014-04-05 17:15:52" + "time": "2014-12-01 17:44:50" }, { "name": "symfony/symfony", - "version": "v2.5.5", + "version": "v2.5.10", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "2aef97bbc95d0c4ae63537cca81bd6d984427d81" + "reference": "6ffe6437a9e734eabd6d092387f065bebfefcd24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/2aef97bbc95d0c4ae63537cca81bd6d984427d81", - "reference": "2aef97bbc95d0c4ae63537cca81bd6d984427d81", + "url": "https://api.github.com/repos/symfony/symfony/zipball/6ffe6437a9e734eabd6d092387f065bebfefcd24", + "reference": "6ffe6437a9e734eabd6d092387f065bebfefcd24", "shasum": "" }, "require": { - "doctrine/common": "~2.2", + "doctrine/common": "~2.3", "php": ">=5.3.3", "psr/log": "~1.0", - "symfony/icu": "~1.0", - "twig/twig": "~1.12" + "twig/twig": "~1.12,>=1.12.3" }, "replace": { "symfony/browser-kit": "self.version", @@ -1786,10 +2086,10 @@ "doctrine/dbal": "~2.2", "doctrine/orm": "~2.2,>=2.2.3", "egulias/email-validator": "~1.2", - "ircmaxell/password-compat": "1.0.*", + "ircmaxell/password-compat": "~1.0", "monolog/monolog": "~1.3", - "ocramius/proxy-manager": ">=0.3.1,<0.6-dev", - "propel/propel1": "1.6.*" + "ocramius/proxy-manager": "~0.4|~1.0", + "propel/propel1": "~1.6" }, "type": "library", "extra": { @@ -1828,29 +2128,35 @@ "keywords": [ "framework" ], - "time": "2014-09-28 17:33:53" + "time": "2015-02-02 09:26:53" }, { "name": "twig/extensions", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/fabpot/Twig-extensions.git", - "reference": "c0ab818595338dd5569369bfce2552d02cec5d50" + "url": "https://github.com/twigphp/Twig-extensions.git", + "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fabpot/Twig-extensions/zipball/c0ab818595338dd5569369bfce2552d02cec5d50", - "reference": "c0ab818595338dd5569369bfce2552d02cec5d50", + "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", + "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", "shasum": "" }, "require": { "twig/twig": "~1.12" }, + "require-dev": { + "symfony/translation": "~2.3" + }, + "suggest": { + "symfony/translation": "Allow the time_diff output to be translated" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -1865,31 +2171,29 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "email": "fabien@symfony.com" } ], "description": "Common additional features for Twig that do not directly belong in core", - "homepage": "https://github.com/fabpot/Twig-extensions", + "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html", "keywords": [ "i18n", "text" ], - "time": "2014-07-05 10:01:35" + "time": "2014-10-30 14:30:03" }, { "name": "twig/twig", - "version": "v1.16.0", + "version": "v1.18.0", "source": { "type": "git", - "url": "https://github.com/fabpot/Twig.git", - "reference": "8ce37115802e257a984a82d38254884085060024" + "url": "https://github.com/twigphp/Twig.git", + "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fabpot/Twig/zipball/8ce37115802e257a984a82d38254884085060024", - "reference": "8ce37115802e257a984a82d38254884085060024", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/4cf7464348e7f9893a93f7096a90b73722be99cf", + "reference": "4cf7464348e7f9893a93f7096a90b73722be99cf", "shasum": "" }, "require": { @@ -1898,7 +2202,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.16-dev" + "dev-master": "1.18-dev" } }, "autoload": { @@ -1924,7 +2228,7 @@ }, { "name": "Twig Team", - "homepage": "https://github.com/fabpot/Twig/graphs/contributors", + "homepage": "http://twig.sensiolabs.org/contributors", "role": "Contributors" } ], @@ -1933,27 +2237,27 @@ "keywords": [ "templating" ], - "time": "2014-07-05 12:19:05" + "time": "2015-01-25 17:32:08" } ], "packages-dev": [ { "name": "sensio/generator-bundle", - "version": "v2.4.0", + "version": "v2.5.3", "target-dir": "Sensio/Bundle/GeneratorBundle", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", - "reference": "d5c0b996a46276d50943a80f95a46b59215a0e68" + "reference": "e50108c2133ee5c9c484555faed50c17a61221d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/d5c0b996a46276d50943a80f95a46b59215a0e68", - "reference": "d5c0b996a46276d50943a80f95a46b59215a0e68", + "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/e50108c2133ee5c9c484555faed50c17a61221d3", + "reference": "e50108c2133ee5c9c484555faed50c17a61221d3", "shasum": "" }, "require": { - "symfony/console": "~2.0", + "symfony/console": "~2.5", "symfony/framework-bundle": "~2.2" }, "require-dev": { @@ -1964,7 +2268,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.3.x-dev" + "dev-master": "2.5.x-dev" } }, "autoload": { @@ -1983,7 +2287,7 @@ } ], "description": "This bundle generates code for you", - "time": "2014-09-22 14:56:14" + "time": "2015-03-17 06:36:52" } ], "aliases": [], @@ -1993,6 +2297,7 @@ "doctrine/doctrine-migrations-bundle": 20 }, "prefer-stable": false, + "prefer-lowest": false, "platform": { "php": ">=5.3.3" }, diff --git a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php index c74573a..9f7878a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php +++ b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php @@ -38,15 +38,16 @@ class GenerateEventsCommand extends ContainerAwareCommand $now = new \DateTime(); $end = new \DateTime(); $end->add($duration); - $output->writeln(sprintf("Generating Dates from %s to %s",$now->format('Y-m-d'),$end->format('Y-m-d'))); - $output->writeln("Fetching repeating events"); /** @var EntityManager $entityManager */ $entityManager = $this->getContainer()->get('doctrine')->getManager(); $repo = $entityManager->getRepository('CalciferBundle:RepeatingEvent'); - $entities = $repo->findAll(); + $entities = $repo->findBy([],['id' => 'asc']); foreach($entities as $entity) { /** @var RepeatingEvent $entity */ $next_date = is_null($entity->nextdate) ? new DateTime() : $entity->nextdate; + /** This is a fuggly hack. It would be best to store the named timezone also in the + * database to avoid problems with daylight savings. */ + $next_date->setTimezone(new \DateTimeZone('Europe/Berlin')); $parser = new RelativeDateParser($entity->repeating_pattern,$next_date,'de'); $event = null; while (($next_date = $parser->getNext()) < $end) { @@ -56,7 +57,7 @@ class GenerateEventsCommand extends ContainerAwareCommand $event->location = $entity->location; $event->startdate = $next_date; if ($entity->duration > 0) { - $duration = new \DateInterval("PT".$entity->duration.'H'); + $duration = new \DateInterval("PT".$entity->duration.'M'); /** @var \DateTime $enddate */ $enddate = clone $next_date; $enddate->add($duration); diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/DefaultController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/DefaultController.php index acb65c9..1f4cce6 100644 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/DefaultController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/DefaultController.php @@ -9,11 +9,11 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; class DefaultController extends Controller { /** - * @Route("/hello/{name}") + * @Route("/über", name="about_calcifer") * @Template() */ - public function indexAction($name) + public function indexAction() { - return array('name' => $name); + return []; } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index 876fecd..79ccc0d 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -14,6 +14,19 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Hackspace\Bundle\CalciferBundle\Entity\Event; use Hackspace\Bundle\CalciferBundle\Form\EventType; +use Symfony\Component\HttpFoundation\Response; +use Jsvrcek\ICS\Model\Calendar; +use Jsvrcek\ICS\Utility\Formatter; +use Jsvrcek\ICS\CalendarStream; +use Jsvrcek\ICS\CalendarExport; +use + Sabre\VObject, + Sabre\CalDAV, + Sabre\DAV, + Sabre\DAVACL, + Sabre\DAV\Exception\Forbidden, + Hackspace\Bundle\CalciferBundle\libs\CalciferCaldavBackend, + Hackspace\Bundle\CalciferBundle\libs\CalciferPrincipalBackend; /** * Event controller. @@ -22,6 +35,88 @@ use Hackspace\Bundle\CalciferBundle\Form\EventType; */ class EventController extends Controller { + /** + * Finds and displays a Event entity. + * + * @Route("/{url}", name="events_caldav", requirements={"url" : "caldav(.+)"}) + */ + public function caldavEntry() + { + // Backends + $calendarBackend = new CalciferCaldavBackend($this); + $principalBackend = new CalciferPrincipalBackend(); + // Directory structure + $tree = [ + new CalDAV\CalendarRootNode($principalBackend, $calendarBackend), + ]; + + $server = new DAV\Server($tree); + + $server->setBaseUri('/caldav'); + + /*$aclPlugin = new DAVACL\Plugin(); + $aclPlugin->allowAccessToNodesWithoutACL = false; + $server->addPlugin($aclPlugin);*/ + + /* CalDAV support */ + $caldavPlugin = new CalDAV\Plugin(); + $server->addPlugin($caldavPlugin); + + /* WebDAV-Sync plugin */ + $server->addPlugin(new DAV\Sync\Plugin()); + +// Support for html frontend + $browser = new DAV\Browser\Plugin(); + $server->addPlugin($browser); + +// And off we go! + $server->exec(); + return new Response(); + } + + /** + * Lists all Event entities as ICS. + * + * @Route("/all.ics", name="events_ics") + * @Method("GET") + * @Template() + */ + public function allEventsAsICSAction() + { + $em = $this->getDoctrine()->getManager(); + + $now = new \DateTime(); + $now->setTime(0, 0, 0); + /** @var QueryBuilder $qb */ + $qb = $em->createQueryBuilder(); + $qb->select(array('e')) + ->from('CalciferBundle:Event', 'e') + ->where('e.startdate >= :startdate') + ->orderBy('e.startdate') + ->setParameter('startdate', $now); + $entities = $qb->getQuery()->execute(); + + $calendar = new Calendar(); + $calendar->setProdId('-//My Company//Cool Calendar App//EN'); + + foreach ($entities as $entity) { + /** @var Event $entity */ + $event = $entity->ConvertToCalendarEvent(); + $calendar->addEvent($event); + } + + $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); + $calendarExport->addCalendar($calendar); + + //output .ics formatted text + $result = $calendarExport->getStream(); + + $response = new Response($result); + $response->headers->set('Content-Type', 'text/calendar'); + + return $response; + } + /** * Lists all Event entities. @@ -35,20 +130,21 @@ class EventController extends Controller $em = $this->getDoctrine()->getManager(); $now = new \DateTime(); - $now->setTime(0,0,0); + $now->setTime(0, 0, 0); /** @var QueryBuilder $qb */ $qb = $em->createQueryBuilder(); - $qb ->select(array('e')) + $qb->select(array('e')) ->from('CalciferBundle:Event', 'e') ->where('e.startdate >= :startdate') ->orderBy('e.startdate') - ->setParameter('startdate',$now); + ->setParameter('startdate', $now); $entities = $qb->getQuery()->execute(); return array( 'entities' => $entities, ); } + /** * Creates a new Event entity. * @@ -85,10 +181,28 @@ class EventController extends Controller * @Method("GET") * @Template("CalciferBundle:Event:edit.html.twig") */ - public function newAction() + public function newAction(Request $request) { $entity = new Event(); + $entity->description = $request->get('description'); + $entity->summary = $request->get('summary'); + $entity->url = $request->get('url'); + if (strlen($request->get('tags')) > 0) { + $tags = explode(",",$request->get('tags')); + foreach($tags as $tag) { + $_tag = new Tag(); + $_tag->name = $tag; + $entity->tags[] = $_tag; + } + } + + if (strlen($request->get('location')) > 0) { + $location = new Location(); + $location->name = $request->get('location'); + $entity->location = $location; + } + return array( 'entity' => $entity, ); @@ -117,7 +231,7 @@ class EventController extends Controller } return array( - 'entity' => $entity + 'entity' => $entity ); } @@ -144,7 +258,7 @@ class EventController extends Controller } return array( - 'entity' => $entity, + 'entity' => $entity, ); } @@ -207,7 +321,7 @@ class EventController extends Controller $startdate = new \DateTime($startdate); $entity->startdate = $startdate; } - $entity->slug = $entity->generateSlug($entity->summary,$em); + $entity->slug = $entity->generateSlug($entity->summary, $em); $enddate = $request->get('enddate'); if (strlen($enddate) > 0) { @@ -246,7 +360,7 @@ class EventController extends Controller if (strlen($location_lon) > 0) { $location_obj->lon = $location_lon; } - $location_obj->slug = $location_obj->generateSlug($location_obj->name,$em); + $location_obj->slug = $location_obj->generateSlug($location_obj->name, $em); $em->persist($location_obj); $em->flush(); $entity->setLocation($location_obj); @@ -255,7 +369,7 @@ class EventController extends Controller $tags = $request->get('tags'); if (strlen($tags) > 0) { - $tags = explode(',', $tags); + $tags = explode(',', strtolower($tags)); $em = $this->getDoctrine()->getManager(); $repo = $em->getRepository('CalciferBundle:Tag'); $entity->clearTags(); @@ -267,7 +381,7 @@ class EventController extends Controller } else { $tag_obj = new Tag(); $tag_obj->name = $tag; - $tag_obj->slug = $tag_obj->generateSlug($tag_obj->name,$em); + $tag_obj->slug = $tag_obj->generateSlug($tag_obj->name, $em); $em->persist($tag_obj); $em->flush(); $entity->addTag($tag_obj); @@ -284,7 +398,8 @@ class EventController extends Controller * @Method({"GET", "POST"}) * @Template("CalciferBundle:Event:delete.html.twig") */ - public function deleteAction(Request $request, $slug) { + public function deleteAction(Request $request, $slug) + { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -299,7 +414,7 @@ class EventController extends Controller } - $confirmation = $request->get('confirmation',false); + $confirmation = $request->get('confirmation', false); if (($request->getMethod() == 'POST') && ($confirmation)) { $em->remove($entity); @@ -309,7 +424,7 @@ class EventController extends Controller } return array( - 'entity' => $entity, + 'entity' => $entity, ); } @@ -321,7 +436,8 @@ class EventController extends Controller * @Method("GET") * @Template("CalciferBundle:Event:edit.html.twig") */ - public function copyAction(Request $request, $slug) { + public function copyAction(Request $request, $slug) + { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -338,7 +454,7 @@ class EventController extends Controller $entity->id = null; return array( - 'entity' => $entity, + 'entity' => $entity, ); } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php index fc07a8c..bbdb83b 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php @@ -17,14 +17,10 @@ use Hackspace\Bundle\CalciferBundle\Entity\Event; use Hackspace\Bundle\CalciferBundle\Form\EventType; use Symfony\Component\HttpFoundation\Response; use Jsvrcek\ICS\Model\Calendar; -use Jsvrcek\ICS\Model\CalendarEvent; -use Jsvrcek\ICS\Model\Relationship\Attendee; -use Jsvrcek\ICS\Model\Relationship\Organizer; - use Jsvrcek\ICS\Utility\Formatter; use Jsvrcek\ICS\CalendarStream; use Jsvrcek\ICS\CalendarExport; -use Jsvrcek\ICS\Model\Description\Geo; +use Symfony\Component\HttpFoundation\AcceptHeader; /** * Location controller. @@ -77,27 +73,7 @@ class LocationController extends Controller foreach ($entities as $entity) { /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->startdate); - if ($entity->enddate instanceof \DateTime) - $event->setEnd($entity->enddate); - $event->setSummary($entity->summary); - $event->setUrl($entity->url); - if ($entity->location instanceof Location) { - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->location->name); - $event->setLocations([$location]); - if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { - $geo = new Geo(); - $geo->setLatitude($entity->location->lat); - $geo->setLongitude($entity->location->lon); - $event->setGeo($geo); - } - } - $event->setDescription($entity->description); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->name); - $event->setLocations([$location]); + $event = $entity->ConvertToCalendarEvent(); $calendar->addEvent($event); } @@ -152,7 +128,8 @@ class LocationController extends Controller * @Route("/{slug}/bearbeiten", name="location_update") * @Method("POST") */ - public function updateAction(Request $request, $slug) { + public function updateAction(Request $request, $slug) + { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -167,8 +144,18 @@ class LocationController extends Controller } if ($location->name != $request->get('name')) { - $location->name = $request->get('name'); - $location->slug = $location->generateSlug($location->name,$em); + // someone changed the name of the location, lets check if the location already exists + $new_location = $repo->findOneBy(['name' => $request->get('name')]); + if (is_null($new_location)) { + $location->name = $request->get('name'); + $location->slug = $location->generateSlug($location->name, $em); + } else { + $request->getSession()->getFlashBag()->add( + 'error', + 'Ort mit diesem Namen existiert bereits.' + ); + return $this->redirect($this->generateUrl('location_edit', array('slug' => $location->slug))); + } } $location->streetaddress = $request->get('streetaddress'); $location->streetnumber = $request->get('streetnumber'); @@ -177,7 +164,7 @@ class LocationController extends Controller $location->description = $request->get('description'); $latlon = $request->get('geocords'); - $latlon = explode(',',$latlon); + $latlon = explode(',', $latlon); if (count($latlon) == 2) { $location->lat = $latlon[0]; $location->lon = $latlon[1]; @@ -188,4 +175,51 @@ class LocationController extends Controller return $this->redirect($this->generateUrl('location_show', array('slug' => $location->slug))); } + + /** + * Finds and displays a Event entity. + * + * @Route("/") + * @Method("GET") + */ + public function indexAction() { + $accepts = AcceptHeader::fromString($this->getRequest()->headers->get('Accept')); + if ($accepts->has('application/json')) { + $em = $this->getDoctrine()->getManager(); + + /** @var QueryBuilder $qb */ + $qb = $em->createQueryBuilder(); + $qb->select(['l']) + ->from('CalciferBundle:Location', 'l') + ->where('lower(l.name) LIKE lower(:location)') + ->orderBy('l.name') + ->setParameter('location', sprintf('%%%s%%',$this->getRequest()->query->get('q'))); + + $entities = $qb->getQuery()->execute(); + + $locations = []; + foreach($entities as $location) { + /** @var Location $location */ + $locations[] = array( + 'id' => $location->id, + 'name' => $location->name, + 'description' => \Michelf\Markdown::defaultTransform($location->description), + 'streetaddress' => $location->streetaddress, + 'streetnumber' => $location->streetnumber, + 'zipcode' => $location->zipcode, + 'city' => $location->city, + 'lon' => $location->lon, + 'lat' => $location->lat, + ); + } + + + $response = new Response(json_encode($locations)); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } else { + return $this->redirect('/'); + } + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php index 18b22e6..28b1341 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php @@ -75,7 +75,8 @@ class RepeatingEventController extends Controller { $entity = new RepeatingEvent(); $this->fillEntity($request, $entity); - if ($this->validateRepeatingEvent($entity)) { + $errors = $entity->isValid(); + if (count($errors) == 0) { $ret = $this->saveRepeatingEvent($request, $entity); if ($entity->id > 0) { return $this->redirect($this->generateUrl('repeating_event_show')); @@ -85,6 +86,7 @@ class RepeatingEventController extends Controller } return [ 'entity' => $entity, + 'errors' => $errors, ]; } @@ -139,7 +141,8 @@ class RepeatingEventController extends Controller } $this->fillEntity($request, $entity); - if ($this->validateRepeatingEvent($entity)) { + $errors = $entity->isValid(); + if (count($errors) == 0) { $ret = $this->saveRepeatingEvent($request, $entity); if ($entity->id > 0) { return $this->redirect($this->generateUrl('repeating_event_show')); @@ -149,6 +152,7 @@ class RepeatingEventController extends Controller } return [ 'entity' => $entity, + 'errors' => $errors, ]; } @@ -172,20 +176,6 @@ class RepeatingEventController extends Controller } - private function validateRepeatingEvent(RepeatingEvent $entity) - { - $fields = [ - 'nextdate', - 'repeating_pattern', - 'summary', - ]; - foreach ($fields as $field) { - if ((is_null($entity->$field)) && (strlen($entity->$field) > 0)) - return false; - } - return true; - } - private function saveRepeatingEvent(Request $request, RepeatingEvent $entity) { $location = $request->get('location'); diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index 1d0c43b..230b828 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -25,6 +25,8 @@ use Jsvrcek\ICS\Utility\Formatter; use Jsvrcek\ICS\CalendarStream; use Jsvrcek\ICS\CalendarExport; use Symfony\Component\Validator\Constraints\DateTime; +use Doctrine\ORM\Query\ResultSetMappingBuilder; +use Symfony\Component\HttpFoundation\AcceptHeader; /** * Tag controller. @@ -47,26 +49,98 @@ class TagController extends Controller /** @var EntityRepository $repo */ $repo = $em->getRepository('CalciferBundle:Tag'); + $tags = []; + $operator = 'or'; + if (strpos($slug, '|') !== false) { + $slugs = explode('|', $slug); + foreach ($slugs as $item) { + /** @var Tag $tag */ + $tag = $repo->findOneBy(['slug' => $item]); - /** @var Tag $location */ - $tag = $repo->findOneBy(['slug' => $slug]); + if ($tag instanceof Tag) { + $tags[] = $tag; + } + } + } else if (strpos($slug, '&') !== false) { + $slugs = explode('&', $slug); + $operator = 'and'; + foreach ($slugs as $item) { + /** @var Tag $tag */ + $tag = $repo->findOneBy(['slug' => $item]); - if (!$tag) { + if ($tag instanceof Tag) { + $tags[] = $tag; + } + } + } else { + /** @var Tag $tag */ + $tag = $repo->findOneBy(['slug' => $slug]); + + if ($tag instanceof Tag) { + $tags[] = $tag; + } + } + + if (count($tags) == 0) { throw $this->createNotFoundException('Unable to find tag entity.'); } $now = new \DateTime(); $now->setTime(0, 0, 0); - /** @var QueryBuilder $qb */ - $qb = $em->createQueryBuilder(); - $qb->select(array('e')) - ->from('CalciferBundle:Event', 'e') - ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->id)) - ->where('e.startdate >= :startdate') - ->orderBy('e.startdate') - ->setParameter('startdate', $now); - $entities = $qb->getQuery()->execute(); + $entities = null; + if ($operator == 'and') { + $sql = << array[@tags@] +) +AND e.startdate >= :startdate +ORDER BY e.startdate +EOF; + $tag_ids = array_reduce($tags, function ($carry, $item) { + if (strlen($carry) == 0) { + return $item->id; + } else { + return $carry . ',' . $item->id; + } + }); + + $sql = str_replace('@tags@', $tag_ids, $sql); + + $rsm = new ResultSetMappingBuilder($em); + $rsm->addRootEntityFromClassMetadata('CalciferBundle:Event', 'e'); + + $query = $em->createNativeQuery($sql, $rsm); + + $query->setParameter('startdate', $now); + + $entities = $query->getResult(); + + } else { + /** @var QueryBuilder $qb */ + $qb = $em->createQueryBuilder(); + $qb->select(array('e')) + ->from('CalciferBundle:Event', 'e') + ->where('e.startdate >= :startdate') + ->orderBy('e.startdate') + ->setParameter('startdate', $now); + + $qb->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', array_reduce($tags, function ($carry, $item) { + if (strlen($carry) == 0) { + return $item->id; + } else { + return $carry . ',' . $item->id; + } + }))); + $entities = $qb->getQuery()->execute(); + } if ($format == 'ics') { $calendar = new Calendar(); @@ -75,25 +149,7 @@ class TagController extends Controller foreach ($entities as $entity) { /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->startdate); - if ($entity->enddate instanceof \DateTime) - $event->setEnd($entity->enddate); - $event->setSummary($entity->summary); - $event->setDescription($entity->description); - $event->setUrl($entity->url); - $event->setUid($entity->slug); - if ($entity->location instanceof Location) { - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->location->name); - $event->setLocations([$location]); - if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { - $geo = new Geo(); - $geo->setLatitude($entity->location->lat); - $geo->setLongitude($entity->location->lon); - $event->setGeo($geo); - } - } + $event = $entity->ConvertToCalendarEvent(); $calendar->addEvent($event); } @@ -110,8 +166,49 @@ class TagController extends Controller } else { return array( 'entities' => $entities, - 'tag' => $tag, + 'tags' => $tags, + 'operator' => $operator, ); } } + + /** + * Finds and displays a Event entity. + * + * @Route("/") + * @Method("GET") + */ + public function indexAction() { + $accepts = AcceptHeader::fromString($this->getRequest()->headers->get('Accept')); + if ($accepts->has('application/json')) { + $em = $this->getDoctrine()->getManager(); + + /** @var QueryBuilder $qb */ + $qb = $em->createQueryBuilder(); + $qb->select(['t']) + ->from('CalciferBundle:Tag', 't') + ->where('t.name LIKE :tag') + ->orderBy('t.name') + ->setParameter('tag', sprintf('%%%s%%',strtolower($this->getRequest()->query->get('q')))); + + $entities = $qb->getQuery()->execute(); + + $tags = []; + foreach($entities as $tag) { + /** @var Tag $tag */ + $tags[] = [ + 'id' => $tag->id, + 'name' => $tag->name, + ]; + } + + + $response = new Response(json_encode($tags)); + $response->headers->set('Content-Type', 'application/json'); + + return $response; + } else { + return $this->redirect('/'); + } + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php index ba972ee..f21c6fa 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php @@ -46,7 +46,7 @@ abstract class BaseEntity { } } - public function __get($name) { + public function &__get($name) { if (property_exists($this,$name)) { return $this->$name; } else { diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index 68104d4..93506ea 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -2,8 +2,20 @@ namespace Hackspace\Bundle\CalciferBundle\Entity; + + use Doctrine\ORM\Mapping as ORM; +use Jsvrcek\ICS\Model\Description\Location As EventLocation; use Symfony\Component\Validator\Constraints\DateTime; +use Jsvrcek\ICS\Model\Calendar; +use Jsvrcek\ICS\Model\CalendarEvent; +use Jsvrcek\ICS\Model\Relationship\Attendee; +use Jsvrcek\ICS\Model\Relationship\Organizer; + +use Jsvrcek\ICS\Utility\Formatter; +use Jsvrcek\ICS\CalendarStream; +use Jsvrcek\ICS\CalendarExport; +use Jsvrcek\ICS\Model\Description\Geo; /** * Event @@ -129,4 +141,35 @@ class Event extends BaseEntity } return $retval; } + + + public function ConvertToCalendarEvent() { + $event = new CalendarEvent(); + $event->setStart($this->startdate); + if ($this->enddate instanceof \DateTime) + $event->setEnd($this->enddate); + $event->setSummary($this->summary); + $event->setUrl($this->url); + $uid = sprintf("https://%s/termine/%s",$_SERVER['HTTP_HOST'],$this->slug); + $event->setUid($uid); + if (count($this->tags) > 0) { + $categories = []; + foreach($this->tags as $tag) { + $event->addCategory($tag->name); + } + } + if ($this->location instanceof Location) { + $location = new EventLocation(); + $location->setName($this->location->name); + $event->setLocations([$location]); + if (\is_float($this->location->lon) && \is_float($this->location->lat)) { + $geo = new Geo(); + $geo->setLatitude($this->location->lat); + $geo->setLongitude($this->location->lon); + $event->setGeo($geo); + } + } + $event->setDescription($this->description); + return $event; + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php index a9ff31c..d2f867a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -4,6 +4,7 @@ namespace Hackspace\Bundle\CalciferBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\PersistentCollection; +use enko\RelativeDateParser\RelativeDateParser; /** * RepeatEvent @@ -84,4 +85,25 @@ class RepeatingEvent extends BaseEntity * ) */ protected $tags = []; + + public function isValid() { + $errors = []; + if ((is_null($this->nextdate)) && (strlen($this->nextdate) > 0)) { + $errors['nextdate'] = "Bitte gebe einen nächsten Termin an."; + } + if ((is_null($this->repeating_pattern)) && (strlen($this->repeating_pattern) > 0)) { + $errors['repeating_pattern'] = "Bitte gebe ein gültiges Wiederholungsmuster an."; + } else { + $this->nextdate->setTimezone(new \DateTimeZone('Europe/Berlin')); + try { + $parser = new RelativeDateParser($this->repeating_pattern,$this->nextdate,'de'); + } catch (\Exception $e) { + $errors['repeating_pattern'] = "Bitte gebe ein gültiges Wiederholungsmuster an."; + } + } + if ((is_null($this->summary)) && (strlen($this->summary) > 0)) { + $errors['summary'] = "Bitte gebe eine Zusammenfassung an."; + } + return $errors; + } } \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss index 7e0730a..2abe00a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss @@ -1,44 +1,22 @@ -.event.box { +.card { h2 { - padding: 0.5rem; - a,a:hover,a:visited { - color: #ffffff; + margin-bottom: 0.3em !important; + a { + color: inherit; } } - - .startdate,.location,.url,.action { - display: inline; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - } - - a i.icon { - text-decoration: none; - } - - ul.tags { - padding-left: 0; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - display: inline; - li { - list-style-type: none; - display: inline; - margin-right: 0.5rem; + .meta { + .label,.button { + margin-bottom: 0.3em; + margin-top: 0.3em; } } } -form .ui.form { - .field { - .attached-label > input, .attached-label > textarea { - margin-bottom: 2rem; - } - .attached-geo-label > input, .attached-geo-label > textarea { - margin-bottom: 3.2rem; - } +#event-form { + textarea { + height: auto; + max-height: none; } } @@ -46,10 +24,6 @@ form .ui.form { height: 20rem; } -.location-edit { - text-decoration: none; -} - #location-description { p { margin-top: 0.5rem; diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss index b4dd9dd..fb47b71 100644 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss @@ -1,37 +1,17 @@ body { - margin: 0; - font-family: 'Roboto', sans-serif; + margin: 50px 0 0; } -header { - top: 0; -} - -header .ui.grid > .column, .title.ui.grid > .column { - margin-top: 0; - margin-bottom: 0; -} - -.box h2 { - font-size: 1rem !important; -} - -a .icon { - text-decoration: none; -} - -a, a:hover, a:visited { - color: #000000; -} - -a:hover { - text-decoration: none; -} - -#mission-statement { - overflow: hidden; - - img { +#main { + &>.basic.segment:first-child { margin-bottom: 0; } -} \ No newline at end of file + &>.basic.segment:last-child { + margin-top: 0; + padding-top: 0; + } +} + +h1.ui.green.block.dividing.header { + background-color: #ffffff; +} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/events.js b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/events.js index c4dddbd..22e1c14 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/events.js +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/events.js @@ -22,7 +22,7 @@ jQuery(document).ready(function () { map = L.map('map'); // add an OpenStreetMap tile layer - L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); @@ -49,7 +49,6 @@ jQuery(document).ready(function () { if (!(jQuery('input[name=location_lat]').val() == undefined)) { jQuery('input[name=location_lat]').val(coords.lat); jQuery('input[name=location_lon]').val(coords.lng); - jQuery('input[name=location]').css('margin-bottom', '3.2rem'); jQuery('span.coords').text('Folgende Koordinaten sind angegeben: lat:' + coords.lat + ', lon:' + coords.lng); } else { jQuery('input[name=geocords]').val(coords.lat + ',' + coords.lng); @@ -83,9 +82,114 @@ jQuery(document).ready(function () { } }); -$(document).ready(function() { +function calcBoxSize(columns) { + var card_selector = jQuery('.ui.cards .card'); + var screen_width = $(window).width() - 14 - 14; /* padding of basic segment */ + // first check if we can display 4 cards on the screen with a minimum width of 399px + var box_width = Math.floor((screen_width / columns)) - 10; + if ((box_width >= 395) || (columns == 1)) { + card_selector.css('width',box_width); + } else { + calcBoxSize(columns - 1); + } +} - if (jQuery('#view-map').length == 1) { +$(window).resize(function(){ + var card_selector = jQuery('.ui.cards .card'); + + if (card_selector.length > 0) { + calcBoxSize(4); + } +}); + +$(document).ready(function() { + var view_map_selector = jQuery('#view-map'); + var card_selector = jQuery('.ui.cards .card'); + + if (card_selector.length > 0) { + calcBoxSize(4); + } + + $('#event_tags').selectize({ + create: true, + diacritics: true, + valueField: 'name', + labelField: 'name', + searchField: 'name', + render: { + item: function(data,escape){ + console.log([data,escape]); + return '
' + escape(data.name) + '
'; + } + }, + load: function(query, callback) { + if (!query.length) return callback(); + $.ajax({ + url: "/tags/", + type: "GET", + dataType: 'json', + data: { + q: query + }, + error: function() { + callback(); + }, + success: function(res) { + console.log(res); + callback(res); + } + }); + } + }); + + $('#event_location').selectize({ + create: true, + diacritics: true, + valueField: 'name', + labelField: 'name', + searchField: 'name', + maxItems: 1, + render: { + item: function(data,escape){ + console.log([data,escape]); + return '
' + escape(data.name) + '
'; + }, + option: function(item, escape) { + return '
' + + '
'+ + '
' + + '' + escape(item.name) + + '
' + + '
'+ + (item.lon && item.lat ? 'lon: '+ escape(item.lon)+' lat: ' + escape(item.lat) : '')+ + (item.streetaddress ? ' Anschrift: ' + item.streetaddress + ' ' + item.streetnumber + ' ' + item.zipcode + ' ' + item.city : '')+ + '
'+ + (item.description ? '
' + item.description + '
' : '') + + '
'+ + '
'; + } + }, + load: function(query, callback) { + if (!query.length) return callback(); + $.ajax({ + url: "/orte/", + type: "GET", + dataType: 'json', + data: { + q: query + }, + error: function() { + callback(); + }, + success: function(res) { + console.log(res); + callback(res); + } + }); + } + }); + + if (view_map_selector.length == 1) { jQuery('.show_map').click(addGeoCoordinates); map = L.map('view-map'); @@ -108,8 +212,8 @@ $(document).ready(function() { }, onVisible: function () { map.invalidateSize(true); - var lat = $('#view-map').data('lat'); - var lon = $('#view-map').data('lon'); + var lat = view_map_selector.data('lat'); + var lon = view_map_selector.data('lon'); if ((lat > 0) && (lon > 0)) { map.setView([lat, lon], 16); var latlng = new L.LatLng(lat, lon); @@ -121,4 +225,4 @@ $(document).ready(function() { } }).modal('attach events', '.show_map', 'show'); } -}); \ No newline at end of file +}); diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Default/index.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Default/index.html.twig index 4ce626e..efc0dd8 100644 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Default/index.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Default/index.html.twig @@ -1 +1,64 @@ -Hello {{ name }}! +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block body -%} +
+

+ Über Calcifer +

+
+
+
+
+
+
+
+ {% image '@CalciferBundle/Resources/assets/images/logo.png' %} + Eine Zeichnung von Calcifer. Gezeichnet von simply-Sylvan (http://simply-sylvan.deviantart.com/art/Calcifer-Purple-176746086) + {% endimage %} +
+
+ Calcifer + +
+ Gezeichnet von simply-Sylvan. +
+
+
+
+
+

Calcifer ist ein Daemon aus dem Anime „Das wandelnde + Schloss“, + der sich darum kümmert das sich Howls Schloss weiter bewegt. Diese Terminverwaltung soll dafür + sorgen + das sich der Hackspace Jena auch weiter bewegt und + viele tolle + Termine statfinden.

+ +

+ Die Software wurde mit Symfony2 und Semantic UI gestrickt. Den + Quellcode findest du auf der Phabricator + Instanz des + Hackspace Jena oder auf Github. +

+ +

+ Solltest du Probleme mit Calcifer haben, kannst du entweder über Phabricator oder Github ein Ticket + anlegen. + Alternativ kannst du auch im Chat des + Hackspace + Jena Probleme melden. +

+ +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig index 66a4061..0b8a100 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig @@ -15,15 +15,14 @@ {% endblock %} {% block body -%} -
-
-
-
-

Möchtest du die Veranstaltung „{{ entity.summary }}“ zum Datum „{{ entity.startdate.format('Y-m-d H:i') }}“ wirklich löschen?

- - Nein -
-
+
+
+
+

Möchtest du die Veranstaltung „{{ entity.summary }}“ zum Datum + „{{ entity.startdate.format('Y-m-d H:i') }}“ wirklich löschen?

+ + Nein +
{% endblock %} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig index a004f41..e21f44a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig @@ -4,29 +4,31 @@ {% stylesheets filter="compass" "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" "@CalciferBundle/Resources/assets/css/events.scss" - "@CalciferBundle/Resources/assets/css/leaflet.scss" %} + "@CalciferBundle/Resources/assets/css/leaflet.scss" + %} {% endstylesheets %} + {% endblock %} {% block javascripts %} {% javascripts "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" "@CalciferBundle/Resources/assets/js/events.js" - "@CalciferBundle/Resources/assets/js/leaflet.js" %} - + "@CalciferBundle/Resources/assets/js/leaflet.js" + %} + {% endjavascripts %} + {% endblock %} {% block body -%} -
-
-

Termin bearbeiten

-
+
+

Termin bearbeiten

-
-
+
+
{{ include('CalciferBundle:Event:event_form.html.twig',{'entity':entity}) }}
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index 4a9b99a..948a40f 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -1,57 +1,61 @@ -
-
-

+
+

{{ entity.summary }}

+
+
+ {{ entity.getFormatedDate() }} +
+ + {% if entity.location is not null %} + + {{ entity.location.name }} + + {% endif %} + + {% if (detail|default(false)) %} + {% if entity.tags|length > 0 %} + {% for tag in entity.tags %} + + {{ tag.name }} + + {% endfor %} + {% endif %} + {% endif %} + + {% if entity.url|length > 0 %} + + {{ entity.url|truncate(30) }} + + {% endif %} +
+ +
+ {% if truncate_summary|default(false) %} +

{{ entity.description|truncate(255)|markdown }}

+ {% else %} +

{{ entity.description|markdown }}

+ {% endif %} +
{% if (detail|default(false)) %} -

- Bearbeiten -

- -

- Löschen -

- -

- Kopieren -

- {% endif %} - -

- {{ entity.getFormatedDate() }} -

- - {% if entity.location is not null %} -

- {{ entity.location.name }} -

- {% endif %} - {% if entity.tags|length > 0 %} - - {% endif %} - - {% if entity.url|length > 0 %} -

- {{ entity.url }} -

- {% endif %} - -
- - {% if truncate_summary|default(false) %} -

{{ entity.description|truncate(255)|markdown }}

- {% else %} -

{{ entity.description|markdown }}

+ + + Bearbeiten + + + + Löschen + + + + Kopieren + {% endif %}

\ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig index 39ac995..e584fe3 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig @@ -1,142 +1,153 @@ -
-
-
- + +
+
+
+ -
- - {% if(errors|default('0') != 0) %} {% if('startdate' in errors|keys) %} +
+ + {% if(errors|default('0') != 0) %} {% if('startdate' in errors|keys) %}
{{ errors.startdate }}
- {% endif %}{% endif %} + {% endif %}{% endif %} - - -
- -
-
+
-
- - -
- - - {% if(errors|default('0') != 0) %} {% if('enddate' in errors|keys) %} -
{{ errors.enddate }}
- {% endif %}{% endif %} - - -
+
+ Bitte gebe das Startdatum im Format ISO 8601 an.
-
- +
+
+ -
- +
+ - {% if(errors|default('0') != 0) %} {% if('summary' in errors|keys) %} -
{{ errors.summary }}
- {% endif %}{% endif %} + {% if(errors|default('0') != 0) %} {% if('enddate' in errors|keys) %} +
{{ errors.enddate }}
+ {% endif %}{% endif %} -
- -
-
+
- -
- - -
- -
Du kannst hier Markdown benutzen.
-
+
+ Bitte gebe das Enddatum im Format ISO 8601 an.
+
+
+ -
- +
+ -
- - -
+ {% if(errors|default('0') != 0) %} {% if('summary' in errors|keys) %} +
{{ errors.summary }}
+ {% endif %}{% endif %}
- -
- - -
- - - - -
- Du kannst zu diesem Ort auch Geokoordinaten hinterlegen.
- {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} -
- -
-
- -
- - -
- - -
Du kannst hier kommasepariert Tags angeben.
-
-
- -
+
+ + +
+ + +
+ +
+ Vergesse nicht das https:// zur URL anzugeben. +
+
+ +
+ + +
+ + + + +
+ +
+ Du kannst zu diesem Ort auch Geokoordinaten hinterlegen (JavaScript erforderlich).
+ {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} +
+ +
+ +
+ + +
+ + +
+
Du kannst hier kommasepariert Tags angeben. +
+
+
+
+
+ + +
+ +
+
Du kannst hier Markdown + benutzen. +
+
+
+
+ + \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/index.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/index.html.twig index bc86b24..91f6cb7 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/index.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/index.html.twig @@ -2,76 +2,105 @@ {% block css %} {% stylesheets filter="compass" - "@CalciferBundle/Resources/assets/css/events.scss" - "@CalciferBundle/Resources/assets/css/leaflet.scss" - %} - + "@CalciferBundle/Resources/assets/css/events.scss" + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} + {% endstylesheets %} {% endblock %} {% block javascripts %} {% javascripts "@CalciferBundle/Resources/assets/js/events.js" - "@CalciferBundle/Resources/assets/js/leaflet.js" - %} + "@CalciferBundle/Resources/assets/js/leaflet.js" %} {% endjavascripts %} {% endblock %} {% block body -%} -
-
-

- Termine - {% if tag|default(false) %} für Tag „{{ tag.name }}“{% endif %} - {% if location|default(false) %} für Ort „{{ location.name }}“ {% endif %} -

- {% if tag|default(false) %} - Link zur Kalenderdatei - {% endif %} - {% if location|default(false) %} - {% if (location.description|length > 0) or location.hasAddress() %} -
- {% if (location.description|length > 0) %} -

{{ location.description|markdown }}

+
+

+ Termine + {% if tags|default(false) %} + {% if tags|length == 1 %} + für Tag {{ tags[0].name }} + {% elseif(tags|length == 2) %} + für die Tags {{ tags[0].name }} {% if operator == 'or' %}oder{% else %}und{% endif %} {{ tags[1].name }} + {% else %} + für die Tags + {% for tag in tags %} + {% if not loop.last %} + {{ tag.name }}{% if loop.index < (tags|length - 1) %},{% endif %} + {% else %} + {% if operator == 'or' %}oder{% else %}und{% endif %} {{ tag.name }} {% endif %} - {% if (location.hasAddress()) %} -
-

- Anschrift:
- {{ location.streetaddress }}{% if(location.streetnumber|length > 0) %} {{ location.streetnumber }}{% endif %}
- {% if(location.zipcode|length > 0) %}{{ location.zipcode }} {% endif %}{{ location.city }} -

- {% endif %} - {% if ((location.lon > 0) and (location.lat > 0)) %} -

Auf einer OpenStreetMap-Karte anzeigen

- - {% endif %} -

+ {% endfor %} {% endif %} {% endif %} -
+ {% if location|default(false) %} für Ort „{{ location.name }}“ {% endif %} + + {% if tag|default(false) %} + Link zur + Kalenderdatei + {% endif %} + {% if location|default(false) %} + {% if (location.description|length > 0) or location.hasAddress() %} +
+ {% if (location.description|length > 0) %} +

{{ location.description|markdown }}

+ {% endif %} + {% if (location.hasAddress()) %} +
+

+ Anschrift:
+ {{ location.streetaddress }}{% if(location.streetnumber|length > 0) %} {{ location.streetnumber }}{% endif %} +
+ {% if(location.zipcode|length > 0) %}{{ location.zipcode }} {% endif %}{{ location.city }} +

+ {% endif %} + {% if ((location.lon > 0) and (location.lat > 0)) %} +

Auf einer OpenStreetMap-Karte anzeigen

+ + {% endif %} +
+ {% endif %} + {% endif %}
-
- {% for entity in entities %} - {{ include('CalciferBundle:Event:event_box.html.twig',{'truncate_summary':true}) }} - {% endfor %} -
+ {% if entities|length > 0 %} +
+
+ {% for entity in entities %} + {{ include('CalciferBundle:Event:event_box.html.twig',{'truncate_summary':true}) }} + {% endfor %} +
+
+ {% else %} +
+
+

Es konnten keine Termine gefunden werden.

+
+
+ {% endif %} {% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig index 7d19293..592eecf 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig @@ -17,7 +17,7 @@ {% endblock %} {% block body -%} -
+
{{ include('CalciferBundle:Event:event_box.html.twig',{'entity' : entity,'detail' : true}) }}
{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Location/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Location/edit.html.twig index 6eb61de..4bd2189 100644 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Location/edit.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Location/edit.html.twig @@ -19,146 +19,151 @@ {% endblock %} {% block body -%} -
-
-

Ort bearbeiten

-
+
+

Ort bearbeiten

-
-
-
+
+ -
-
- - -
- - -
- -
-
+ {% set errors = app.session.flashbag.get('error') %} + {% if errors|length > 0 %} +
+
Bitte korrigiere folgende Fehler:
+
    + {% for flashMessage in errors %} +
  • {{ flashMessage }}
  • + {% endfor %} +
+ {% endif %} +
+ -
- - -
- - -
Du kannst hier Markdown benutzen. -
-
+
+
- -
- - -
- - -
-
- -
- - -
- - -
-
- -
- - -
- - -
-
- -
- - -
- - -
-
- -
- - -
- - -
- Gebe entweder Breitengrad und Längengrad (Mit Punkten!) kommasepariert ein oder wähle einen Punkt auf der Karte aus. -
- -
-
- - - -
+
+ + +
+ +
+ +
Du kannst hier Markdown benutzen. +
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + +
+ +
+ Gebe entweder Breitengrad und Längengrad (Mit Punkten!) kommasepariert ein oder wähle + einen Punkt auf der Karte aus. +
+ +
+ + + +
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/delete.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/delete.html.twig index 26d8f37..0dc39f5 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/delete.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/delete.html.twig @@ -15,15 +15,13 @@ {% endblock %} {% block body -%} -
-
-
-
-

Möchtest du den wiederholenden Termin „{{ entity.summary }}“ wirklich löschen?

- - Nein -
-
+
+
+
+

Möchtest du den wiederholenden Termin „{{ entity.summary }}“ wirklich löschen?

+ + Nein +
{% endblock %} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig index 25f2f34..9b4e9a8 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig @@ -4,8 +4,7 @@ {% stylesheets filter="compass" "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" "@CalciferBundle/Resources/assets/css/events.scss" - "@CalciferBundle/Resources/assets/css/leaflet.scss" - %} + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} {% endstylesheets %} {% endblock %} @@ -15,21 +14,18 @@ "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" "@CalciferBundle/Resources/assets/js/repeating_events.js" "@CalciferBundle/Resources/assets/js/events.js" - "@CalciferBundle/Resources/assets/js/leaflet.js" - %} + "@CalciferBundle/Resources/assets/js/leaflet.js" %} {% endjavascripts %} {% endblock %} {% block body -%} -
-
-

Wiederholenden Termin bearbeiten

-
+
+

Wiederholenden Termin bearbeiten

-
-
+
+
{{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig',{'entity':entity}) }}
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig index 12664f7..eec30f3 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig @@ -15,51 +15,47 @@ {% endblock %} {% block body -%} -
-
-

- Wiederholende Termine -

-
+
+

+ Wiederholende Termine +

-
-
- - +
+
+ + + + + + + + + + {% for entity in entities %} - - - - + + + + - - - {% for entity in entities %} - - - - - - - {% endfor %} - - - - - - -
ZusammenfassungNächstes DatumWiederholungsmusterAktionen
ZusammenfassungNächstes DatumWiederholungsmusterAktionen + {{ entity.summary }} + + {{ entity.nextdate.format('Y-m-d H:i') }} + + {{ entity.repeating_pattern }} + + Bearbeiten | + Löschen +
- {{ entity.summary }} - - {{ entity.nextdate.format('Y-m-d H:i') }} - - {{ entity.repeating_pattern }} - - Bearbeiten | - Löschen -
Neuen wiederholenden Termin anlegen
-
+ {% endfor %} + + + + Neuen wiederholenden Termin anlegen + + +
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig index 22b9509..6ad09a8 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig @@ -20,14 +20,12 @@ {% endblock %} {% block body -%} -
-
-

Wiederholenden Termin erstellen

-
+
+

Wiederholenden Termin erstellen

-
-
+
+
{{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig') }}
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig index c532246..f258b28 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig @@ -1,10 +1,9 @@ -
-
-
- +
+ -
+
- + {% if(errors|default('0') != 0) %} {% if('nextdate' in errors|keys) %} +
{{ errors.nextdate }}
+ {% endif %}{% endif %} -
- -
+
+ +
+ Bitte gebe das Datum des nächsten Termin im Format ISO 8601 an.
- + -
+
-
- Hier gibst du bitte die Dauer der Veranstaltung in Minuten an. -
+
+
+ Hier gibst du bitte die Dauer der Veranstaltung in Minuten an.
-
- +
+ -
+
+ {% if(errors|default('0') != 0) %} {% if('repeating_pattern' in errors|keys) %} +
{{ errors.repeating_pattern }}
+ {% endif %}{% endif %} +
-
- -
- -
- Gebe hier ein Wiederholungsmuster an. -
+
+ Gebe hier ein Wiederholungsmuster an.
-
- +
+ -
+
- -
- -
+ {% if(errors|default('0') != 0) %} {% if('summary' in errors|keys) %} +
{{ errors.summary }}
+ {% endif %}{% endif %}
- + -
+
- -
Du kannst hier Markdown - benutzen. -
+
+
Du kannst hier Markdown + benutzen.
- + -
+
-
+
-
+
+
-
- Du kannst zu diesem Ort auch Geokoordinaten hinterlegen.
- {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} +
+ Du kannst zu diesem Ort auch Geokoordinaten hinterlegen (JavaScript erforderlich).
+ {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} +
+