Merge pull request #3024 from wallabag/store-date

Added publication date and author
This commit is contained in:
Nicolas Lœuillet 2017-04-18 13:12:28 +02:00 committed by GitHub
commit 64f1d8f77a
23 changed files with 243 additions and 17 deletions

View file

@ -0,0 +1,65 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Add published_at and published_by in `entry` table.
*/
class Version20170405182620 extends AbstractMigration implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
private function getTable($tableName)
{
return $this->container->getParameter('database_table_prefix').$tableName;
}
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$entryTable = $schema->getTable($this->getTable('entry'));
$this->skipIf($entryTable->hasColumn('published_at'), 'It seems that you already played this migration.');
$entryTable->addColumn('published_at', 'datetime', [
'notnull' => false,
]);
$this->skipIf($entryTable->hasColumn('published_by'), 'It seems that you already played this migration.');
$entryTable->addColumn('published_by', 'text', [
'notnull' => false,
]);
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
$entryTable = $schema->getTable($this->getTable('entry'));
$this->skipIf(!$entryTable->hasColumn('published_at'), 'It seems that you already played this migration.');
$entryTable->dropColumn('published_at');
$this->skipIf(!$entryTable->hasColumn('published_by'), 'It seems that you already played this migration.');
$entryTable->dropColumn('published_by');
}
}

View file

@ -912,6 +912,14 @@ a.add-to-wallabag-link-after::after {
content: "\e953"; content: "\e953";
} }
.icon-pencil2::before {
content: "\e906";
}
.icon-users::before {
content: "\e972";
}
.icon-time::before { .icon-time::before {
content: "\e952"; content: "\e952";
} }

View file

@ -121,6 +121,24 @@ class Entry
*/ */
private $updatedAt; private $updatedAt;
/**
* @var \DateTime
*
* @ORM\Column(name="published_at", type="datetime", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
private $publishedAt;
/**
* @var array
*
* @ORM\Column(name="published_by", type="json_array", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
private $publishedBy;
/** /**
* @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"}) * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
* @ORM\JoinTable * @ORM\JoinTable
@ -676,4 +694,44 @@ class Entry
return $this; return $this;
} }
/**
* @return \Datetime
*/
public function getPublishedAt()
{
return $this->publishedAt;
}
/**
* @param \Datetime $publishedAt
*
* @return Entry
*/
public function setPublishedAt(\Datetime $publishedAt)
{
$this->publishedAt = $publishedAt;
return $this;
}
/**
* @return string
*/
public function getPublishedBy()
{
return $this->publishedBy;
}
/**
* @param string $publishedBy
*
* @return Entry
*/
public function setPublishedBy($publishedBy)
{
$this->publishedBy = $publishedBy;
return $this;
}
} }

View file

@ -79,6 +79,14 @@ class ContentProxy
$entry->setContent($html); $entry->setContent($html);
$entry->setHttpStatus(isset($content['status']) ? $content['status'] : ''); $entry->setHttpStatus(isset($content['status']) ? $content['status'] : '');
if (isset($content['date']) && null !== $content['date'] && '' !== $content['date']) {
$entry->setPublishedAt(new \DateTime($content['date']));
}
if (!empty($content['authors'])) {
$entry->setPublishedBy($content['authors']);
}
$entry->setLanguage(isset($content['language']) ? $content['language'] : ''); $entry->setLanguage(isset($content['language']) ? $content['language'] : '');
$entry->setMimetype(isset($content['content_type']) ? $content['content_type'] : ''); $entry->setMimetype(isset($content['content_type']) ? $content['content_type'] : '');
$entry->setReadingTime(Utils::getReadingTime($html)); $entry->setReadingTime(Utils::getReadingTime($html));

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
# annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations' # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations'
created_at: 'Oprettelsesdato' created_at: 'Oprettelsesdato'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Gem ny artikel' page_title: 'Gem ny artikel'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %count% Anmerkungen' annotations_on_the_entry: '{0} Keine Anmerkungen|{1} Eine Anmerkung|]1,Inf[ %count% Anmerkungen'
created_at: 'Erstellungsdatum' created_at: 'Erstellungsdatum'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Neuen Artikel speichern' page_title: 'Neuen Artikel speichern'
placeholder: 'https://website.de' placeholder: 'https://website.de'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations' annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations'
created_at: 'Creation date' created_at: 'Creation date'
published_at: 'Publication date'
published_by: 'Published by'
new: new:
page_title: 'Save new entry' page_title: 'Save new entry'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
annotations_on_the_entry: '{0} Sin anotaciones|{1} Una anotación|]1,Inf[ %count% anotaciones' annotations_on_the_entry: '{0} Sin anotaciones|{1} Una anotación|]1,Inf[ %count% anotaciones'
created_at: 'Fecha de creación' created_at: 'Fecha de creación'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Guardar un nuevo artículo' page_title: 'Guardar un nuevo artículo'
placeholder: 'http://sitioweb.com' placeholder: 'http://sitioweb.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'اصلی' original_article: 'اصلی'
annotations_on_the_entry: '{0} بدون حاشیه|{1} یک حاشیه|]1,Inf[ %nbحاشیه% annotations' annotations_on_the_entry: '{0} بدون حاشیه|{1} یک حاشیه|]1,Inf[ %nbحاشیه% annotations'
created_at: 'زمان ساخت' created_at: 'زمان ساخت'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'ذخیرهٔ مقالهٔ تازه' page_title: 'ذخیرهٔ مقالهٔ تازه'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: "original" original_article: "original"
annotations_on_the_entry: "{0} Aucune annotation|{1} Une annotation|]1,Inf[ %count% annotations" annotations_on_the_entry: "{0} Aucune annotation|{1} Une annotation|]1,Inf[ %count% annotations"
created_at: "Date de création" created_at: "Date de création"
published_at: "Date de publication"
published_by: "Publié par"
new: new:
page_title: "Sauvegarder un nouvel article" page_title: "Sauvegarder un nouvel article"
placeholder: "http://website.com" placeholder: "http://website.com"

View file

@ -224,6 +224,8 @@ entry:
original_article: 'originale' original_article: 'originale'
annotations_on_the_entry: '{0} Nessuna annotazione|{1} Una annotazione|]1,Inf[ %count% annotazioni' annotations_on_the_entry: '{0} Nessuna annotazione|{1} Una annotazione|]1,Inf[ %count% annotazioni'
created_at: 'Data di creazione' created_at: 'Data di creazione'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Salva un nuovo contenuto' page_title: 'Salva un nuovo contenuto'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %count% anotacions" annotations_on_the_entry: "{0} Pas cap d'anotacion|{1} Una anotacion|]1,Inf[ %count% anotacions"
created_at: 'Data de creacion' created_at: 'Data de creacion'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Enregistrar un novèl article' page_title: 'Enregistrar un novèl article'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'oryginalny' original_article: 'oryginalny'
annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %count% adnotacji' annotations_on_the_entry: '{0} Nie ma adnotacji |{1} Jedna adnotacja |]1,Inf[ %count% adnotacji'
created_at: 'Czas stworzenia' created_at: 'Czas stworzenia'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Zapisz nowy wpis' page_title: 'Zapisz nowy wpis'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
annotations_on_the_entry: '{0} Sem anotações|{1} Uma anotação|]1,Inf[ %nbAnnotations% anotações' annotations_on_the_entry: '{0} Sem anotações|{1} Uma anotação|]1,Inf[ %nbAnnotations% anotações'
created_at: 'Data de criação' created_at: 'Data de criação'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Salvar nova entrada' page_title: 'Salvar nova entrada'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'original' original_article: 'original'
# annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations' # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations'
created_at: 'Data creării' created_at: 'Data creării'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Salvează un nou articol' page_title: 'Salvează un nou articol'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -224,6 +224,8 @@ entry:
original_article: 'orijinal' original_article: 'orijinal'
# annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations' # annotations_on_the_entry: '{0} No annotations|{1} One annotation|]1,Inf[ %count% annotations'
created_at: 'Oluşturulma tarihi' created_at: 'Oluşturulma tarihi'
# published_at: 'Publication date'
# published_by: 'Published by'
new: new:
page_title: 'Yeni makaleyi kaydet' page_title: 'Yeni makaleyi kaydet'
placeholder: 'http://website.com' placeholder: 'http://website.com'

View file

@ -44,9 +44,23 @@
<div id="article-informations"> <div id="article-informations">
<i class="tool icon icon-calendar" title="{{ 'entry.view.created_at'|trans }}"> <i class="tool icon icon-calendar" title="{{ 'entry.view.created_at'|trans }}">
{{ entry.createdAt|date('Y-m-d') }} {{ entry.createdAt|date('Y-m-d H:i') }}
</i> </i>
{% if entry.publishedAt is not null %}
<i class="tool icon icon-pencil2" title="{{ 'entry.view.published_at'|trans }}">
{{ entry.publishedAt|date('Y-m-d H:i') }}
</i>
{% endif %}
{% if entry.publishedBy is not empty %}
<i class="tool icon icon-users" title="{{ 'entry.view.published_by'|trans }}">
{% for author in entry.publishedBy %}
{{ author }}{% if not loop.last %}, {% endif %}
{% endfor %}
</i>
{% endif %}
<i class="tool icon icon-time"> <i class="tool icon icon-time">
{% set readingTime = entry.readingTime / app.user.config.readingSpeed %} {% set readingTime = entry.readingTime / app.user.config.readingSpeed %}
{% if readingTime > 0 %} {% if readingTime > 0 %}

View file

@ -138,7 +138,7 @@
<span>scuttle</span> <span>scuttle</span>
</a> </a>
</li> </li>
{% endif %} {% endif %}
{% if craue_setting('share_diaspora') %} {% if craue_setting('share_diaspora') %}
<li> <li>
<a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&amp;title={{ entry.title|striptags|url_encode }}&amp;notes=&amp;v=1&amp;noui=1&amp;jump=doclose" target="_blank"> <a href="{{ craue_setting('diaspora_url') }}/bookmarklet?url={{ entry.url|url_encode }}&amp;title={{ entry.title|striptags|url_encode }}&amp;notes=&amp;v=1&amp;noui=1&amp;jump=doclose" target="_blank">
@ -226,8 +226,22 @@
</li> </li>
<li> <li>
<i class="material-icons" title="{{ 'entry.view.created_at'|trans }}">today</i> <i class="material-icons" title="{{ 'entry.view.created_at'|trans }}">today</i>
{{ entry.createdAt|date('Y-m-d') }} {{ entry.createdAt|date('Y-m-d H:i') }}
</li> </li>
{% if entry.publishedAt is not null %}
<li>
<i class="material-icons" title="{{ 'entry.view.published_at'|trans }}">create</i>
{{ entry.publishedAt|date('Y-m-d H:i') }}
</li>
{% endif %}
{% if entry.publishedBy is not empty %}
<li>
<i class="material-icons" title="{{ 'entry.view.published_by'|trans }}">person</i>
{% for author in entry.publishedBy %}
{{ author }}{% if not loop.last %}, {% endif %}
{% endfor %}
</li>
{% endif %}
<li> <li>
<i class="material-icons link">link</i> <i class="material-icons link">link</i>
<a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|striptags }}" class="tool"> <a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|striptags }}" class="tool">

View file

@ -135,9 +135,44 @@ class EntryControllerTest extends WallabagCoreTestCase
->getRepository('WallabagCoreBundle:Entry') ->getRepository('WallabagCoreBundle:Entry')
->findByUrlAndUserId($this->url, $this->getLoggedInUserId()); ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
$author = $content->getPublishedBy();
$this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content); $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
$this->assertEquals($this->url, $content->getUrl()); $this->assertEquals($this->url, $content->getUrl());
$this->assertContains('Google', $content->getTitle()); $this->assertContains('Google', $content->getTitle());
$this->assertEquals('2015-03-28 15:37:39', $content->getPublishedAt()->format('Y-m-d H:i:s'));
$this->assertEquals('Morgane Tual', $author[0]);
}
public function testPostWithMultipleAuthors()
{
$url = 'http://www.liberation.fr/planete/2017/04/05/donald-trump-et-xi-jinping-tentative-de-flirt-en-floride_1560768';
$this->logInAs('admin');
$client = $this->getClient();
$crawler = $client->request('GET', '/new');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
$form = $crawler->filter('form[name=entry]')->form();
$data = [
'entry[url]' => $url,
];
$client->submit($form, $data);
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$content = $client->getContainer()
->get('doctrine.orm.entity_manager')
->getRepository('WallabagCoreBundle:Entry')
->findByUrlAndUserId($url, $this->getLoggedInUserId());
$authors = $content->getPublishedBy();
$this->assertEquals('2017-04-05 19:26:13', $content->getPublishedAt()->format('Y-m-d H:i:s'));
$this->assertEquals('Raphaël Balenieri, correspondant à Pékin', $authors[0]);
$this->assertEquals('Frédéric Autran, correspondant à New York', $authors[1]);
} }
public function testPostNewOkUrlExist() public function testPostNewOkUrlExist()
@ -606,7 +641,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(2, $crawler->filter('div[class=entry]')); $this->assertCount(3, $crawler->filter('div[class=entry]'));
} }
public function testFilterOnReadingTimeOnlyLower() public function testFilterOnReadingTimeOnlyLower()
@ -642,7 +677,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(4, $crawler->filter('div[class=entry]')); $this->assertCount(5, $crawler->filter('div[class=entry]'));
} }
public function testFilterOnCreationDate() public function testFilterOnCreationDate()
@ -661,7 +696,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(5, $crawler->filter('div[class=entry]')); $this->assertCount(6, $crawler->filter('div[class=entry]'));
$data = [ $data = [
'entry_filter[createdAt][left_date]' => date('d/m/Y'), 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
@ -670,7 +705,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(5, $crawler->filter('div[class=entry]')); $this->assertCount(6, $crawler->filter('div[class=entry]'));
$data = [ $data = [
'entry_filter[createdAt][left_date]' => '01/01/1970', 'entry_filter[createdAt][left_date]' => '01/01/1970',
@ -774,7 +809,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$form['entry_filter[previewPicture]']->tick(); $form['entry_filter[previewPicture]']->tick();
$crawler = $client->submit($form); $crawler = $client->submit($form);
$this->assertCount(1, $crawler->filter('div[class=entry]')); $this->assertCount(2, $crawler->filter('div[class=entry]'));
} }
public function testFilterOnLanguage() public function testFilterOnLanguage()
@ -789,7 +824,7 @@ class EntryControllerTest extends WallabagCoreTestCase
]; ];
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(2, $crawler->filter('div[class=entry]')); $this->assertCount(3, $crawler->filter('div[class=entry]'));
$form = $crawler->filter('button[id=submit-filter]')->form(); $form = $crawler->filter('button[id=submit-filter]')->form();
$data = [ $data = [
@ -1014,7 +1049,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(1, $crawler->filter('div[class=entry]')); $this->assertCount(2, $crawler->filter('div[class=entry]'));
$crawler = $client->request('GET', '/all/list'); $crawler = $client->request('GET', '/all/list');
$form = $crawler->filter('button[id=submit-filter]')->form(); $form = $crawler->filter('button[id=submit-filter]')->form();
@ -1025,7 +1060,7 @@ class EntryControllerTest extends WallabagCoreTestCase
$crawler = $client->submit($form, $data); $crawler = $client->submit($form, $data);
$this->assertCount(7, $crawler->filter('div[class=entry]')); $this->assertCount(8, $crawler->filter('div[class=entry]'));
} }
public function testSearch() public function testSearch()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long