Implement RSSFeeds, fixed controllers implementation, fixed tests

This commit is contained in:
Andrey
2013-06-04 19:12:59 +02:00
parent 1d7c60ac41
commit affdfe7a0a
23 changed files with 393 additions and 221 deletions

View File

@@ -12,7 +12,8 @@
namespace Alchemy\Phrasea\Controller\Admin;
use Alchemy\Phrasea\Application as PhraseaApplication;
use Repositories;
use Entities\Feed;
use Entities\FeedPublisher;
use Silex\Application;
use Silex\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
@@ -47,9 +48,9 @@ class Publications implements ControllerProviderInterface
$controllers->post('/create/', function(PhraseaApplication $app, Request $request) {
$publisher = new \Entities\FeedPublisher($app['authentication']->getUser(), true);
$publisher = new FeedPublisher($app['authentication']->getUser(), true);
$feed = new \Entities\Feed($publisher, $request->request->get('title'), $request->request->get('subtitle'));
$feed = new Feed($publisher, $request->request->get('title'), $request->request->get('subtitle'));
if ($request->request->get('public') == '1') {
$feed->setPublic(true);
@@ -178,7 +179,7 @@ class Publications implements ControllerProviderInterface
$user = \User_Adapter::getInstance($request->request->get('usr_id'), $app);
$feed = $app["EM"]->getRepository("Entities\Feed")->find($id);
$publisher = new \Entities\FeedPublisher($user, false);
$publisher = new FeedPublisher($user, false);
$publisher->setFeed($feed);
$feed->addPublisher($publisher);

View File

@@ -539,7 +539,8 @@ class Root implements ControllerProviderInterface
private function getPublicationStartPage(Application $app)
{
return $app['twig']->render('client/home_inter_pub_basket.html.twig', array(
'feeds' => \Feed_Collection::load_all($app, $app['authentication']->getUser()),
// 'feeds' => \Feed_Collection::load_all($app, $app['authentication']->getUser()),
'feeds' => $app['EM']->getRepository('Entities\Feed')->getAllforUser($app['authentication']->getUser()),
'image_size' => (int) $app['authentication']->getUser()->getPrefs('images_size')
));
}

View File

@@ -160,13 +160,15 @@ class Lightbox implements ControllerProviderInterface
$controllers->get('/ajax/LOAD_FEED_ITEM/{entry_id}/{item_id}/', function(SilexApplication $app, $entry_id, $item_id) {
$entry = \Feed_Entry_Adapter::load_from_id($app, $entry_id);
$item = new \Feed_Entry_Item($app['phraseanet.appbox'], $entry, $item_id);
// $entry = \Feed_Entry_Adapter::load_from_id($app, $entry_id);
$entry = $app['EM']->getRepository("Entities\FeedEntry")->find($entry_id);
// $item = new \Feed_Entry_Item($app['phraseanet.appbox'], $entry, $item_id);
$item = $entry->getItems()->getItem($item_id);
if ($app['browser']->isMobile()) {
$output = $app['twig']->render('lightbox/feed_element.html.twig', array(
'feed_element' => $item,
'module_name' => $item->get_record()->get_title()
'module_name' => $item->getRecord()->get_title()
)
);
@@ -313,7 +315,8 @@ class Lightbox implements ControllerProviderInterface
return $app->redirectPath('logout');
}
$feed_entry = \Feed_Entry_Adapter::load_from_id($app, $entry_id);
// $feed_entry = \Feed_Entry_Adapter::load_from_id($app, $entry_id);
$feed_entry = $app['EM']->getEntity("Entities\FeedEntry")->find($entry_id);
$template = 'lightbox/feed.html.twig';
@@ -321,12 +324,12 @@ class Lightbox implements ControllerProviderInterface
$template = 'lightbox/IE6/feed.html.twig';
}
$content = $feed_entry->get_content();
$content = $feed_entry->getItems();
$output = $app['twig']->render($template, array(
'feed_entry' => $feed_entry,
'first_item' => array_shift($content),
'local_title' => $feed_entry->get_title(),
'local_title' => $feed_entry->getTitle(),
'module' => 'lightbox',
'module_name' => _('admin::monitor: module validation')
)

View File

@@ -15,6 +15,8 @@ use Alchemy\Phrasea\Feed\Aggregate;
use Alchemy\Phrasea\Feed\AggregateLinkGenerator;
use Alchemy\Phrasea\Controller\RecordsRequest;
use Alchemy\Phrasea\Feed\LinkGenerator;
use Entities\FeedEntry;
use Entities\FeedItem;
use Silex\Application;
use Silex\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
@@ -60,7 +62,7 @@ class Feed implements ControllerProviderInterface
$author_name = $request->request->get('author_name');
$author_email = $request->request->get('author_email');
$entry = new \Entities\FeedEntry();
$entry = new FeedEntry();
$entry->setFeed($feed);
$entry->setPublisher($publisher);
$entry->setTitle($title);
@@ -72,7 +74,7 @@ class Feed implements ControllerProviderInterface
$publishing = RecordsRequest::fromRequest($app, $request, true, array(), array('bas_chupub'));
foreach ($publishing as $record) {
$item = new \Entities\FeedItem();
$item = new FeedItem();
$item->setEntry($entry);
$item->setRecordId($record->get_record_id());
$item->setSbasId($record->get_sbas_id());
@@ -166,7 +168,7 @@ class Feed implements ControllerProviderInterface
continue;
}
$item = new \entities\FeedItem($entry, $item_sort_datas[0]);
$item = new FeedItem($entry, $item_sort_datas[0]);
$item->setEntry($entry);
$entry->addItem($item);
$item->setOrd($item_sort_datas[1]);
@@ -262,11 +264,9 @@ class Feed implements ControllerProviderInterface
$feeds = $app["EM"]->getRepository("Entities\Feed")->findAll();
$aggregateGenerator = new AggregateLinkGenerator($app['url_generator'], $app['EM'], $app['tokens']);
$aggregate = new Aggregate($app, $feeds);
$link = $aggregateGenerator->generate($aggregate, $app['authentication']->getUser(), AggregateLinkGenerator::FORMAT_RSS, null, $renew);
$link = $app['feed.aggregate-link-generator']->generate($aggregate, $app['authentication']->getUser(), AggregateLinkGenerator::FORMAT_RSS, null, $renew);
$output = array(
'texte' => '<p>' . _('publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.')
@@ -283,9 +283,7 @@ class Feed implements ControllerProviderInterface
$feed = $app["EM"]->getRepository("Entities\Feed")->loadWithUser($app, $app['authentication']->getUser(), $id);
$linkGenerator = new LinkGenerator($app['url_generator'], $app['EM'], $app['tokens']);
$link = $linkGenerator->generate($feed, $app['authentication']->getUser(), LinkGenerator::FORMAT_RSS, null, $renew);
$link = $app['feed.user-link-generator']->generate($feed, $app['authentication']->getUser(), LinkGenerator::FORMAT_RSS, null, $renew);
$output = array(
'texte' => '<p>' . _('publication::Voici votre fil RSS personnel. Il vous permettra d\'etre tenu au courrant des publications.')

View File

@@ -11,7 +11,7 @@
namespace Alchemy\Phrasea\Controller\Prod;
use \Alchemy\Phrasea\Feed\Aggregate;
use Alchemy\Phrasea\Feed\Aggregate;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\Exception\SessionNotFound;
use Silex\Application as SilexApplication;
@@ -75,8 +75,8 @@ class Root implements ControllerProviderInterface
// $user_feeds = \Feed_Collection::load_all($app, $app['authentication']->getUser());
// $feeds = array_merge(array($user_feeds->get_aggregate()), $user_feeds->get_feeds());
$user_feeds = $app["EM"]->getRepository("Entities\Feed")->getAllForUser($app['authentication']->getUser());
$aggregate = new Aggregate($app, $user_feeds);
$feeds = $app["EM"]->getRepository("Entities\Feed")->getAllForUser($app['authentication']->getUser());
// $aggregate = new Aggregate($app, $user_feeds);
$thjslist = "";
@@ -118,7 +118,7 @@ class Root implements ControllerProviderInterface
'GV_thesaurus' => $app['phraseanet.registry']->get('GV_thesaurus'),
'cgus_agreement' => \databox_cgu::askAgreement($app),
'css' => $css,
'aggregate' => $aggregate,
'feeds' => $feeds,
'GV_google_api' => $app['phraseanet.registry']->get('GV_google_api'),
'queries_topics' => $queries_topics,
'search_status' => \databox_status::getSearchStatus($app),

View File

@@ -725,10 +725,7 @@ class Login implements ControllerProviderInterface
$app->addFlash('error', _('login::erreur: No available connection - Please contact sys-admin'));
}
$public_feeds = \Feed_Collection::load_public_feeds($app);
$feeds = $public_feeds->get_feeds();
array_unshift($feeds, $public_feeds->get_aggregate());
$feeds = $app['EM']->getRepository('Entities\Feed')->findAllPublic();
$form = $app->form(new PhraseaAuthenticationForm());
$form->setData(array(

View File

@@ -32,15 +32,15 @@ class RSSFeeds implements ControllerProviderInterface
$perPage = 5;
$entries = $feed->getEntries((($page - 1) * $perPage), $perPage);
if ($format == \Entities\Feed::FORMAT_RSS) {
if ($format == 'rss') {
$content = new \Feed_XML_RSS();
}
if ($format == \Entities\Feed::FORMAT_ATOM) {
if ($format == 'atom') {
$content = new \Feed_XML_Atom();
}
if ($format == \Entities\Feed::FORMAT_COOLIRIS) {
if ($format == 'cooliris') {
$content = new \Feed_XML_Cooliris();
}
@@ -77,7 +77,6 @@ class RSSFeeds implements ControllerProviderInterface
};
$controllers->get('/feed/{id}/{format}/', function(Application $app, $id, $format) use ($display_feed) {
// $feed = new \Feed_Adapter($app, $id);
$feed = $app["EM"]->getRepository("Entities\Feed")->find($id);
if (!$feed->isPublic()) {
@@ -112,7 +111,6 @@ class RSSFeeds implements ControllerProviderInterface
$controllers->get('/userfeed/aggregated/{token}/{format}/', function(Application $app, $token, $format) use ($display_feed) {
$token = $app["EM"]->getRepository("Entities\AggregateToken")->findBy(array("id" => $id));
//$feed = $token->getFeed();
$request = $app['request'];
@@ -125,8 +123,6 @@ class RSSFeeds implements ControllerProviderInterface
->assert('format', '(rss|atom)');
$controllers->get('/aggregated/{format}/', function(Application $app, $format) use ($display_feed) {
//$feeds = \Feed_Collection::load_public_feeds($app);
//$feed = $feeds->get_aggregate();
$feeds = $app["EM"]->getRepository("Entities\Feed")->findAllPublic();
$feed = new Aggregate($app, $feeds);
@@ -140,8 +136,6 @@ class RSSFeeds implements ControllerProviderInterface
->assert('format', '(rss|atom)');
$controllers->get('/cooliris/', function(Application $app) use ($display_feed) {
// $feeds = \Feed_Collection::load_public_feeds($app);
// $feed = $feeds->get_aggregate();
$feeds = $app["EM"]->getRepository("Entities\Feed")->findAllPublic();
$feed = new Aggregate($app, $feeds);
@@ -149,7 +143,7 @@ class RSSFeeds implements ControllerProviderInterface
$page = (int) $request->query->get('page');
$page = $page < 1 ? 1 : $page;
return $display_feed($app, $feed, \Feed_Adapter::FORMAT_COOLIRIS, $page);
return $display_feed($app, $feed, 'cooliris', $page);
})
->bind('feed_public_cooliris');

View File

@@ -23,7 +23,7 @@ class FeedServiceProvider implements ServiceProviderInterface
$app['feed.user-link-generator'] = $app->share(function($app) {
return new LinkGenerator($app['url_generator'], $app['EM'], $app['tokens']);
});
$app['feed.aggreagate-link-generator'] = $app->share(function($app) {
$app['feed.aggregate-link-generator'] = $app->share(function($app) {
return new AggregateLinkGenerator($app['url_generator'], $app['EM'], $app['tokens']);
});
}

View File

@@ -28,21 +28,55 @@ class AggregateLinkGenerator
{
switch ($format) {
case self::FORMAT_ATOM:
$params = array('token' => $this->getAggregateToken($user, $renew)->getValue(),
'format' => 'atom');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user_aggregated', array(
'token' => $this->getAggregateToken($user, $renew)->getValue(),
'format' => 'atom',
), UrlGenerator::ABSOLUTE_URL),
$this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $aggregate->getTitle(), 'Atom'),
'application/atom+xml'
);
break;
case self::FORMAT_RSS:
$params = array('token' => $this->getAggregateToken($user, $renew)->getValue(),
'format' => 'rss');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user_aggregated', array(
'token' => $this->getAggregateToken($user, $renew)->getValue(),
'format' => 'rss',
), UrlGenerator::ABSOLUTE_URL),
$this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $aggregate->getTitle(), 'RSS'),
'application/rss+xml'
);
break;
default:
throw new InvalidArgumentException(sprintf('Format %s is not recognized.', $format));
}
}
public function generatePublic(Aggregate $aggregate, $format, $page = null)
{
switch ($format) {
case self::FORMAT_ATOM:
$params = array('format' => 'atom');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $aggregate->getTitle(), 'Atom'),
'application/atom+xml'
);
break;
case self::FORMAT_RSS:
$params = array('format' => 'rss');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user_aggregated', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $aggregate->getTitle(), 'RSS'),
'application/rss+xml'
);

View File

@@ -28,23 +28,59 @@ class LinkGenerator
{
switch ($format) {
case self::FORMAT_ATOM:
$params = array('token' => $this->getFeedToken($feed, $user, $renew)->getValue(),
'id' => $feed->getId(),
'format' => 'atom');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user', array(
'token' => $this->getFeedToken($feed, $user, $renew)->getValue(),
'id' => $feed->getId(),
'format' => 'atom',
), UrlGenerator::ABSOLUTE_URL),
$this->generator->generate('feed_user', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $feed->getTitle(), 'Atom'),
'application/atom+xml'
);
break;
case self::FORMAT_RSS:
$params = array('token' => $this->getFeedToken($feed, $user, $renew)->getValue(),
'id' => $feed->getId(),
'format' => 'rss');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_user', array(
'token' => $this->getFeedToken($feed, $user, $renew)->getValue(),
'id' => $feed->getId(),
'format' => 'rss',
), UrlGenerator::ABSOLUTE_URL),
$this->generator->generate('feed_user', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $feed->getTitle(), 'RSS'),
'application/rss+xml'
);
break;
default:
throw new InvalidArgumentException(sprintf('Format %s is not recognized.', $format));
}
}
public function generatePublic(Feed $feed, $format, $page = null)
{
switch ($format) {
case self::FORMAT_ATOM:
$params = array('id' => $feed->getId(),
'format' => 'atom');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_public', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $feed->getTitle(), 'Atom'),
'application/atom+xml'
);
break;
case self::FORMAT_RSS:
$params = array('id' => $feed->getId(),
'format' => 'rss');
if (null !== $page) {
$params['page'] = $page;
}
return new FeedLink(
$this->generator->generate('feed_public', $params, UrlGenerator::ABSOLUTE_URL),
sprintf('%s - %s', $feed->getTitle(), 'RSS'),
'application/rss+xml'
);

View File

@@ -424,4 +424,27 @@ class Feed implements FeedInterface
{
return $this->tokens;
}
/**
* Add entries
*
* @param \Entities\FeedEntry $entries
* @return Feed
*/
public function addEntrie(\Entities\FeedEntry $entries)
{
$this->entries[] = $entries;
return $this;
}
/**
* Remove entries
*
* @param \Entities\FeedEntry $entries
*/
public function removeEntrie(\Entities\FeedEntry $entries)
{
$this->entries->removeElement($entries);
}
}

View File

@@ -303,4 +303,15 @@ class FeedEntry
return false;
}
public function getItem($id)
{
foreach ($this->items as $item) {
if ($item->getId() == $id) {
return ($item);
}
}
return null;
}
}

View File

@@ -118,7 +118,7 @@ class FeedItem
return $this->entry;
}
/**
* @var int
* @var integer
*/
private $ord;
@@ -126,10 +126,10 @@ class FeedItem
/**
* Set ord
*
* @param \int $ord
* @param integer $ord
* @return FeedItem
*/
public function setOrd(\int $ord)
public function setOrd($ord)
{
$this->ord = $ord;
@@ -139,7 +139,7 @@ class FeedItem
/**
* Get ord
*
* @return \int
* @return integer
*/
public function getOrd()
{
@@ -191,4 +191,9 @@ class FeedItem
{
return $this->updated_on;
}
public function setLastInFeedItem()
{
$this->setOrd($this->getEntry()->getItems()->count() + 1);
}
}

View File

@@ -45,7 +45,7 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
public function fire($event, $params, &$entry)
{
$params = array(
'entry_id' => $entry->get_id()
'entry_id' => $entry->getId()
);
$dom_xml = new DOMDocument('1.0', 'UTF-8');
@@ -72,13 +72,18 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
->include_templates(false)
->email_not_null(true);
if ($entry->get_feed()->get_collection()) {
$Query->on_base_ids(array($entry->get_feed()->get_collection()->get_base_id()));
if ($entry->getFeed()->getCollection($this->app)) {
$Query->on_base_ids(array($entry->getFeed()->getCollection($this->app)->get_base_id()));
}
$start = 0;
$perLoop = 100;
$from = array(
'email' => $entry->getAuthorEmail(),
'name' => $entry->getAuthorName()
);
do {
$results = $Query->limit($start, $perLoop)->execute()->get_results();
@@ -93,7 +98,7 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
\random::TYPE_FEED_ENTRY
, $user_to_notif->get_id()
, null
, $entry->get_id()
, $entry->getId()
);
$url = $this->app->url('lightbox', array('LOG' => $token));
@@ -107,8 +112,8 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
if ($readyToSend) {
$mail = MailInfoNewPublication::create($this->app, $receiver);
$mail->setButtonUrl($url);
$mail->setAuthor($entry->get_author_name());
$mail->setTitle($entry->get_title());
$mail->setAuthor($entry->getAuthorName());
$mail->setTitle($entry->getTitle());
$this->app['notification.deliverer']->deliver($mail);
$mailed = true;
@@ -116,6 +121,7 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
}
$this->broker->notify($user_to_notif->get_id(), __CLASS__, $datas, $mailed);
}
$start += $perLoop;
} while (count($results) > 0);
@@ -134,16 +140,20 @@ class eventsmanager_notify_feed extends eventsmanager_notifyAbstract
$sx = simplexml_load_string($datas);
try {
$entry = \Feed_Entry_Adapter::load_from_id($this->app, (int) $sx->entry_id);
$entry = $this->app['EM']->getRepository("Entities\FeedEntry")->find((int) $sx->entry_id);
} catch (\Exception $e) {
return array();
}
if (null === $entry) {
return array();
}
$ret = array(
'text' => sprintf(
_('%1$s has published %2$s')
, $entry->get_author_name()
, '<a href="/lightbox/feeds/entry/' . $entry->get_id() . '/" target="_blank">' . $entry->get_title() . '</a>'
, $entry->getAuthorName()
, '<a href="/lightbox/feeds/entry/' . $entry->getId() . '/" target="_blank">' . $entry->getTitle() . '</a>'
)
, 'class' => ($unread == 1 ? 'reload_baskets' : '')
);

View File

@@ -27,8 +27,8 @@
<div class="display_id">{% if first_item %}{{first_item.get_ord()}}{% endif %}</div>
</td>
<td style="text-align:left;width:auto;">
<div class="title title15" title="{% if first_item %}{{first_item.get_record().get_title|e}}{% endif %}">
{% if first_item %}{{first_item.get_record().get_title|raw}}{% endif %}
<div class="title title15" title="{% if first_item %}{{first_item.getRecord().getTitle|e}}{% endif %}">
{% if first_item %}{{first_item.get_record().getTitle|raw}}{% endif %}
</div>
</td>
<td style="text-align:right;width:230px;">
@@ -43,9 +43,9 @@
<div class="lightbox_container PNB record_display_box">
{% if first_item %}
{% if app['authentication'].getUser().ACL().has_access_to_subdef(first_item.get_record(), 'preview') %}
{% set bask_prev = first_item.get_record().get_preview() %}
{% set bask_prev = first_item.getRecord().get_preview() %}
{% else %}
{% set bask_prev = first_item.get_record().get_thumbnail() %}
{% set bask_prev = first_item.getRecord().get_thumbnail() %}
{% endif %}
{{thumbnail.format(bask_prev,bask_prev.get_width(),bask_prev.get_height(),'', false, false)}}
{% endif %}
@@ -60,8 +60,8 @@
<div class="display_id"></div>
</td>
<td style="text-align:left;width:auto;">
<div class="title title15" title="{% if first_item %}{{first_item.get_record().get_title|e}}{% endif %}">
{% if first_item %}{{first_item.get_record().get_title}}{% endif %}
<div class="title title15" title="{% if first_item %}{{first_item.getRecord().get_title|e}}{% endif %}">
{% if first_item %}{{first_item.getRecord().get_title}}{% endif %}
</div>
</td>
<td style="text-align:right;width:230px;">
@@ -83,7 +83,7 @@
<div class="lightbox_container PNB">
{% set business = app['authentication'].getUser().ACL().has_right_on_base(first_item.get_record().get_base_id(), 'canmodifrecord') %}
{% if first_item %}
{{caption.format_caption(first_item.get_record(), '', null, business)}}
{{caption.format_caption(first_item.getRecord(), '', null, business)}}
{% endif %}
</div>
</div>

View File

@@ -3,14 +3,14 @@
<div id="sc_container">
{% for element in feed_entry.get_content() %}
<div class="basket_element_wrapper">
<a href="{{ path('lightbox_ajax_load_feeditem', { 'entry_id' : feed_entry.get_id(), 'item_id' : element.get_id()}) }}">
<div id="scid_{{element.get_id()}}" class="basket_element ui-corner-all {% if first_item and first_item.get_id() == element.get_id() %}selected{% endif %}">
<div class="display_id">{{element.get_ord()}}</div>
{{thumbnail.format(element.get_record().get_thumbnail() ,114,85, '', true, false)}}
<a href="{{ path('lightbox_ajax_load_feeditem', { 'entry_id' : feed_entry.getId(), 'item_id' : element.getId()}) }}">
<div id="scid_{{element.getId()}}" class="basket_element ui-corner-all {% if first_item and first_item.getId() == element.getId() %}selected{% endif %}">
<div class="display_id">{{element.getOrd()}}</div>
{{thumbnail.format(element.getRecord().get_thumbnail() ,114,85, '', true, false)}}
<form name="download_form" class="download_form" style="display:none;">
<input type="hidden" name="basrec" value="{{element.get_record().get_serialize_key()}}"/>
<input type="hidden" name="basrec" value="{{element.getRecord().get_serialize_key()}}"/>
</form>
<div tooltipsrc="{{ path('prod_tooltip_preview', { 'sbas_id' : element.get_record().get_sbas_id(), 'record_id' : element.get_record().get_record_id() }) }}" class="previewTips"></div>
<div tooltipsrc="{{ path('prod_tooltip_preview', { 'sbas_id' : element.getRecord().get_sbas_id(), 'record_id' : element.getRecord().get_record_id() }) }}" class="previewTips"></div>
</div>
</a>
</div>

View File

@@ -22,7 +22,7 @@
<i class="icon-download icon-white"></i>
</button>
<form name="download_form" style="display:none;">
<input type="hidden" name="basrec" value="{{feed_element.get_record().get_serialize_key()}}"/>
<input type="hidden" name="basrec" value="{{feed_element.getRecord().get_serialize_key()}}"/>
</form>
|
{% endif %}

View File

@@ -8,10 +8,10 @@
{% endblock %}
{% block header_rss %}
{% for feed in feeds %}
{% set link = feed.get_homepage_link(app['phraseanet.registry'], 'rss') %}
{% for feed in feeds %}
{% set link = app['feed.user-link-generator'].generatePublic(feed, 'rss') %}
<link rel="alternate" type="{{ link.get_mimetype() }}" title="{{ link.get_title() }}" href="{{ link.get_href() }}" />
{% set link = feed.get_homepage_link(app['phraseanet.registry'], 'atom') %}
{% set link = app['feed.user-link-generator'].generatePublic(feed, 'atom') %}
<link rel="alternate" type="{{ link.get_mimetype() }}" title="{{ link.get_title() }}" href="{{ link.get_href() }}" />
{% endfor %}
{% endblock %}

View File

@@ -16,46 +16,46 @@
</style>
<div class="PNB" style="height:200px;bottom:auto;">
<div class="PNB10 record_list" style="overflow:auto;">
{% for content in entry.get_content() %}
{% for content in entry.getItems() %}
<div class="sortable" style="position:relative;float:left;">
{{ _self.format_diapo(content.get_record()) }}
{{ _self.format_diapo(content.getRecord()) }}
<form>
<input type="hidden" name="item_id" value="{{content.get_id()}}" />
<input type="hidden" name="item_id" value="{{content.getId()}}" />
</form>
</div>
{% endfor %}
</div>
</div>
<form method="post" action="{{ path('prod_feeds_entry_update', { 'id' : entry.get_id() }) }}" class="entry_update main_form">
<form method="post" action="{{ path('prod_feeds_entry_update', { 'id' : entry.getId() }) }}" class="entry_update main_form">
<input type="hidden" name="sorted_lst" value="" />
<div class="PNB" style="top:200px;bottom:50px;">
<div class="PNB" style="width:50%;right:auto;">
<div class="PNB10 fields">
<div><label for="feed_add_title">{% trans 'publication : titre' %}</label></div>
<div><input class="required_text" type="text" name="title" id="feed_add_title" value="{{ entry.get_title() }}" /></div>
<div><input class="required_text" type="text" name="title" id="feed_add_title" value="{{ entry.getTitle() }}" /></div>
<div><label for="feed_add_subtitle">{% trans 'publication : sous titre' %}</label></div>
<div><textarea id="feed_add_subtitle" name="subtitle">{{ entry.get_subtitle() }}</textarea></div>
<div><textarea id="feed_add_subtitle" name="subtitle">{{ entry.getSubtitle() }}</textarea></div>
<div><label for="feed_add_author_name">{% trans 'publication : autheur' %}</label></div>
<div><input class="required_text" type="text" name="author_name" id="feed_add_author_name" value="{{ entry.get_author_name() }}" /></div>
<div><input class="required_text" type="text" name="author_name" id="feed_add_author_name" value="{{ entry.getAuthorName() }}" /></div>
<div><label for="feed_add_author_mail">{% trans 'publication : email autheur' %}</label></div>
<div><input class="required_text" type="text" name="author_mail" id="feed_add_author_mail" value="{{ entry.get_author_email() }}" /></div>
<div><input class="required_text" type="text" name="author_mail" id="feed_add_author_mail" value="{{ entry.getAuthorEmail() }}" /></div>
</div>
</div>
<div class="PNB" style="width:50%;left:auto;">
<div class="PNB10 feeds">
<h1>{% trans 'Fils disponibles' %}</h1>
<div class="list">
{% set feed_id = entry.get_feed().get_id() %}
{% for feed in feeds.get_feeds() %}
{% if feed.is_publisher(app['authentication'].getUser()) %}
<div class="feed {% if loop.index is odd%}odd{% endif %} {% if feed_id == feed.get_id() %}selected{% endif %}">
<span>{{ feed.get_title() }}</span>
<input type="hidden" value="{{ feed.get_id() }}"/>
{% set feed_id = entry.getFeed().getId() %}
{% for feed in feeds %}
{% if feed.isPublisher(app['authentication'].getUser()) %}
<div class="feed {% if loop.index is odd%}odd{% endif %} {% if feed_id == feed.getId() %}selected{% endif %}">
<span>{{ feed.getTitle() }}</span>
<input type="hidden" value="{{ feed.getId() }}"/>
</div>
{% endif %}
{% endfor %}
<input type="hidden" value="{{ feed_id }}" name="feed_id" />
<input type="hidden" value="{{ entry.get_id() }}" name="entry_id" />
<input type="hidden" value="{{ entry.getId() }}" name="entry_id" />
</div>
</div>

View File

@@ -52,7 +52,7 @@
{% endblock %}
{% block rss %}
{% for feed in aggregate.getFeeds() %}
{% for feed in feeds %}
{% set link = app['feed.user-link-generator'].generate(feed, app['authentication'].getUser(), 'rss') %}
<link rel="alternate" type="{{ link.getMimetype() }}" title="{{ link.getTitle() }}" href="{{ link.getURI() }}" />
{% set link = app['feed.user-link-generator'].generate(feed, app['authentication'].getUser(), 'rss') %}

View File

@@ -3,9 +3,6 @@
namespace Alchemy\Tests\Phrasea\Controller\Prod;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\Feed\Aggregate;
use Alchemy\Phrasea\Feed\AggregateLinkGenerator;
use Alchemy\Phrasea\Feed\LinkGenerator;
use Symfony\Component\CssSelector\CssSelector;
class ControllerFeedTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
@@ -41,34 +38,6 @@ class ControllerFeedTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
protected $entry_authorname = 'author name';
protected $entry_authormail = 'author.mail@example.com';
public function setUp()
{
parent::setUp();
// $this->publisher = new \Entities\FeedPublisher(self::$DI['user']);
//
// $this->feed = new \Entities\Feed($this->publisher, $this->feed_title, $this->feed_subtitle);
//
// $this->entry = new \Entities\FeedEntry(
// $this->feed
// , $this->publisher
// , $this->entry_title
// , $this->entry_subtitle
// , $this->entry_authorname
// , $this->entry_authormail
// );
//
// $this->item = new \Entities\FeedItem($this->entry, self::$DI['record_1']);
//
// $this->publisher->setFeed($this->feed);
//
// self::$DI['app']["EM"]->persist($this->feed);
// self::$DI['app']["EM"]->persist($this->publisher);
// self::$DI['app']["EM"]->persist($this->entry);
// self::$DI['app']["EM"]->persist($this->item);
// self::$DI['app']["EM"]->flush();
}
public static function setUpBeforeClass()
{
parent::setUpBeforeClass();
@@ -80,21 +49,6 @@ class ControllerFeedTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
self::$DI['user']->ACL()->set_masks_on_base(self::$DI['collection_no_access_by_status']->get_base_id(), '0000000000000000000000000000000000000000000000000001000000000000', '0000000000000000000000000000000000000000000000000001000000000000', '0000000000000000000000000000000000000000000000000001000000000000', '0000000000000000000000000000000000000000000000000001000000000000');
}
public function tearDown()
{
// if ($this->feed instanceof \Entities\Feed) {
// self::$DI['app']["EM"]->remove($this->feed);
// } else if ($this->entry instanceof \Entities\FeedEntry) {
// self::$DI['app']["EM"]->remove($this->entry);
// if ($this->publisher instanceof \Entities\FeedPublisher) {
// self::$DI['app']["EM"]->remove($this->publisher);
// }
// }
// self::$DI['app']["EM"]->flush();
parent::tearDown();
}
public function testRequestAvailable()
{
$feed = $this->insertOneFeed(self::$DI['user']);
@@ -178,12 +132,9 @@ class ControllerFeedTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
{
$entry = $this->insertOneFeedEntry(self::$DI['user_alt1']);
try {
$crawler = self::$DI['client']->request('GET', '/prod/feeds/entry/' . $entry->getId() . '/edit/');
$this->fail('Should raise an exception');
} catch (\Exception_UnauthorizedAction $e) {
}
$crawler = self::$DI['client']->request('GET', '/prod/feeds/entry/' . $entry->getId() . '/edit/');
$pageContent = self::$DI['client']->getResponse();
$this->assertEquals(403, $pageContent->getStatusCode());
}
public function testEntryUpdate()
@@ -474,46 +425,67 @@ class ControllerFeedTest extends \PhraseanetWebTestCaseAuthenticatedAbstract
{
$feed = $this->insertOneFeed(self::$DI['user']);
$generator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGenerator')
self::$DI['app']['feed.aggregate-link-generator'] = $this->getMockBuilder('Alchemy\Phrasea\Feed\AggregateLinkGenerator')
->disableOriginalConstructor()
->getMock();
$link = $this->getMockBuilder('Alchemy\Phrasea\Feed\FeedLink')
->disableOriginalConstructor()
->getMock();
$link->expects($this->once())
->method('getURI')
->will($this->returnValue('http://aggregated-link/'));
self::$DI['app']['feed.aggregate-link-generator']->expects($this->once())
->method('generate')
->with($this->isInstanceOf('Alchemy\Phrasea\Feed\Aggregate'), $this->isInstanceOf('\User_Adapter'), 'rss', null, false)
->will($this->returnValue($link));
$random = self::$DI['app']['tokens'];
self::$DI['client']->request('GET', '/prod/feeds/subscribe/aggregated/');
$aggregateGenerator = new AggregateLinkGenerator($generator, self::$DI['app']['EM'], $random);
$feeds = self::$DI['app']["EM"]->getRepository("\Entities\Feed")->getAllForUser(self::$DI['user']);
$crawler = self::$DI['client']->request('GET', '/prod/feeds/subscribe/aggregated/');
$this->assertTrue(self::$DI['client']->getResponse()->isOk());
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$pageContent = json_decode(self::$DI['client']->getResponse()->getContent());
$this->assertTrue(is_object($pageContent));
$this->assertTrue(is_string($pageContent->texte));
$aggregate = new Aggregate(self::$DI['app'], $feeds);
$suscribe_link = $aggregateGenerator->generate($aggregate, self::$DI['user'], AggregateLinkGenerator::FORMAT_RSS);
$this->assertContains($suscribe_link->getURI(), $pageContent->texte);
$pageContent = json_decode(self::$DI['client']->getResponse()->getContent(), true);
$this->assertArrayHasKey('texte', $pageContent);
$this->assertArrayHasKey('titre', $pageContent);
$this->assertInternalType('string', $pageContent['texte']);
$this->assertInternalType('string', $pageContent['titre']);
$this->assertContains('http://aggregated-link/', $pageContent['texte']);
}
public function testSuscribe()
{
$feed = $this->insertOneFeed(self::$DI['user']);
$generator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGenerator')
self::$DI['app']['feed.user-link-generator'] = $this->getMockBuilder('Alchemy\Phrasea\Feed\LinkGenerator')
->disableOriginalConstructor()
->getMock();
$random = self::$DI['app']['tokens'];
$linkGenerator = new LinkGenerator($generator, self::$DI['app']['EM'], $random);
$link = $this->getMockBuilder('Alchemy\Phrasea\Feed\FeedLink')
->disableOriginalConstructor()
->getMock();
$link->expects($this->once())
->method('getURI')
->will($this->returnValue('http://user-link/'));
self::$DI['app']['feed.user-link-generator']->expects($this->once())
->method('generate')
->with($this->isInstanceOf('\Entities\Feed'), $this->isInstanceOf('\User_Adapter'), 'rss', null, false)
->will($this->returnValue($link));
$crawler = self::$DI['client']->request('GET', '/prod/feeds/subscribe/' . $feed->getId() . '/');
$this->assertTrue(self::$DI['client']->getResponse()->isOk());
$this->assertEquals("application/json", self::$DI['client']->getResponse()->headers->get("content-type"));
$pageContent = json_decode(self::$DI['client']->getResponse()->getContent());
$this->assertTrue(is_object($pageContent));
$this->assertTrue(is_string($pageContent->texte));
$suscribe_link = $linkGenerator->generate($feed, self::$DI['user'], LinkGenerator::FORMAT_RSS);
var_dump($suscribe_link);
$this->assertContains($suscribe_link->getURI(), $pageContent->texte);
$pageContent = json_decode(self::$DI['client']->getResponse()->getContent(), true);
$this->assertArrayHasKey('texte', $pageContent);
$this->assertArrayHasKey('titre', $pageContent);
$this->assertInternalType('string', $pageContent['texte']);
$this->assertInternalType('string', $pageContent['titre']);
$this->assertContains('http://user-link/', $pageContent['texte']);
}
}

View File

@@ -49,7 +49,6 @@ class AggregateLinkGeneratorTest extends \PhraseanetPHPUnitAbstract
$link = $linkGenerator->generate($aggregate, $user, $format, $page, $renew);
$this->assertSame($expected, $link->getUri());
if ($format == "atom") {
$this->assertSame("application/atom+xml", $link->getMimetype());
$this->assertSame("AGGREGATE - Atom", $link->getTitle());
@@ -61,8 +60,10 @@ class AggregateLinkGeneratorTest extends \PhraseanetPHPUnitAbstract
if ($alreadyCreated) {
if ($renew) {
$this->assertCount(2, $capture);
$this->assertEquals($format, $capture['format']);
if (null !== $page) {
$this->assertEquals($page, $capture['page']);
}
$this->assertNotEquals($tokenValue, $capture['token']);
$this->assertCount(0, self::$DI['app']['EM']
@@ -72,17 +73,25 @@ class AggregateLinkGeneratorTest extends \PhraseanetPHPUnitAbstract
->getRepository("Entities\AggregateToken")
->findBy(array('value' => $capture['token'])));
} else {
$this->assertEquals(array(
$expectedParams = array(
'token' => $tokenValue,
'format' => $format,
), $capture);
);
if ($page !== null) {
$expectedParams['page'] = $page;
}
$this->assertEquals($expectedParams, $capture);
$this->assertCount(1, self::$DI['app']['EM']
->getRepository("Entities\AggregateToken")
->findBy(array('value' => $tokenValue)));
}
} else {
$this->assertCount(2, $capture);
if (null !== $page) {
$this->assertEquals($page, $capture['page']);
}
$this->assertEquals($format, $capture['format']);
$this->assertEquals(12, strlen($capture['token']));
@@ -126,4 +135,14 @@ class AggregateLinkGeneratorTest extends \PhraseanetPHPUnitAbstract
array('doliprane', 'rss', $user, 1, true, true),
);
}
public function provideGenerationDataPublic()
{
return array(
array('doliprane', 'atom', null),
array('doliprane', 'atom', 1),
array('doliprane', 'rss', null),
array('doliprane', 'rss', 1)
);
}
}

View File

@@ -52,10 +52,12 @@ class LinkGeneratorTest extends \PhraseanetPHPUnitAbstract
if ($alreadyCreated) {
if ($renew) {
$this->assertCount(3, $capture);
$this->assertEquals($feed->getId(), $capture['id']);
$this->assertEquals($format, $capture['format']);
$this->assertNotEquals($tokenValue, $capture['token']);
if (null !== $page) {
$this->assertEquals($page, $capture['page']);
}
$this->assertCount(0, self::$DI['app']['EM']
->getRepository("Entities\FeedToken")
@@ -64,18 +66,26 @@ class LinkGeneratorTest extends \PhraseanetPHPUnitAbstract
->getRepository("Entities\FeedToken")
->findBy(array('value' => $capture['token'])));
} else {
$this->assertEquals(array(
$expectedParams = array(
'token' => $tokenValue,
'id' => $feed->getId(),
'format' => $format,
), $capture);
);
if ($page !== null) {
$expectedParams['page'] = $page;
}
$this->assertEquals($expectedParams, $capture);
$this->assertCount(1, self::$DI['app']['EM']
->getRepository("Entities\FeedToken")
->findBy(array('value' => $tokenValue)));
}
} else {
$this->assertCount(3, $capture);
if (null !== $page) {
$this->assertEquals($page, $capture['page']);
}
$this->assertEquals($feed->getId(), $capture['id']);
$this->assertEquals($format, $capture['format']);
$this->assertEquals(12, strlen($capture['token']));
@@ -91,6 +101,51 @@ class LinkGeneratorTest extends \PhraseanetPHPUnitAbstract
self::$DI['app']['EM']->flush();
}
/**
* @dataProvider provideGenerationDataPublic
*/
public function testGeneratePublic($expected, $format, $feed, $page)
{
self::$DI['app']['EM']->persist($feed);
self::$DI['app']['EM']->flush();
$generator = $this->getMockBuilder('Symfony\Component\Routing\Generator\UrlGenerator')
->disableOriginalConstructor()
->getMock();
$capture = null;
$generator->expects($this->once())
->method('generate')
->with('feed_public', $this->isType('array'), UrlGenerator::ABSOLUTE_URL)
->will($this->returnCallback(function ($name, $data, $option) use (&$capture, $expected) {
$capture = $data;
return $expected;
}));
$random = self::$DI['app']['tokens'];
$linkGenerator = new LinkGenerator($generator, self::$DI['app']['EM'], $random);
$link = $linkGenerator->generatePublic($feed, $format, $page);
$this->assertSame($expected, $link->getUri());
if ($format == "atom") {
$this->assertSame("application/atom+xml", $link->getMimetype());
$this->assertSame("Title - Atom", $link->getTitle());
}
elseif ($format == "rss") {
$this->assertSame("application/rss+xml", $link->getMimetype());
$this->assertSame("Title - RSS", $link->getTitle());
}
if (null !== $page) {
$this->assertEquals($page, $capture['page']);
}
$this->assertEquals($feed->getId(), $capture['id']);
$this->assertEquals($format, $capture['format']);
}
public function provideGenerationData()
{
$user = $this->getMockBuilder('User_Adapter')
@@ -123,4 +178,17 @@ class LinkGeneratorTest extends \PhraseanetPHPUnitAbstract
array('doliprane', 'rss', $feed, $user, 1, true, true),
);
}
public function provideGenerationDataPublic()
{
$feed = new \Entities\Feed();
$feed->setTitle('Title');
return array(
array('doliprane', 'atom', $feed, null),
array('doliprane', 'atom', $feed, 1),
array('doliprane', 'rss', $feed, null),
array('doliprane', 'rss', $feed, 1)
);
}
}