Просмотр исходного кода

Merge branch 'hotfixes' into beta

Conflicts:
	CHANGELOG
	README.fr.md
	README.md
	constants.php
Marien Fressinaud 11 лет назад
Родитель
Сommit
799bb6e0de

+ 15 - 0
CHANGELOG

@@ -1,5 +1,20 @@
 # Journal des modifications
 
+## 2014-10-09 FreshRSS 0.8.1 / 0.9.1 (beta)
+
+* UI
+	* Add a space after tag icon
+* Statistics
+	* Add an average per day on the 30 day period graph
+	* Add percent of total on top 10 feed
+* Bug fixes
+	* Fix "mark as read" in global view
+	* Fix "read all" shortcut
+	* Fix categories not appearing when adding a new feed (GET action)
+	* Fix enclosure problem
+	* Fix getExtension() on PHP < 5.3.7
+
+
 ## 2014-09-26 FreshRSS 0.8.0 / 0.9.0 (beta)
 
 * UI

+ 2 - 2
README.fr.md

@@ -10,8 +10,8 @@ Il permet de gérer plusieurs utilisateurs, et dispose d’un mode de lecture an
 * Site officiel : http://freshrss.org
 * Démo : http://demo.freshrss.org/
 * Développeur : Marien Fressinaud <dev@marienfressinaud.fr>
-* Version actuelle : 0.9.0
-* Date de publication 2014-09-26
+* Version actuelle : x.y.z
+* Date de publication : YYYY-MM-DD
 * License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
 
 ![Logo de FreshRSS](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)

+ 2 - 2
README.md

@@ -10,8 +10,8 @@ It is a multi-user application with an anonymous reading mode.
 * Official website: http://freshrss.org
 * Demo: http://demo.freshrss.org/
 * Developer: Marien Fressinaud <dev@marienfressinaud.fr>
-* Current version: 0.9.0
-* Publication date: 2014-09-26
+* Current version: x.y.z
+* Publication date: YYYY-MM-DD
 * License [GNU AGPL 3](http://www.gnu.org/licenses/agpl-3.0.html)
 
 ![FreshRSS logo](http://marienfressinaud.fr/data/images/freshrss/freshrss_title.png)

+ 1 - 1
app/Controllers/feedController.php

@@ -171,7 +171,7 @@ class FreshRSS_feed_Controller extends Minz_ActionController {
 
 			// GET request so we must ask confirmation to user
 			Minz_View::prependTitle(Minz_Translate::t('add_rss_feed') . ' · ');
-			$this->view->categories = $this->catDAO->listCategories();
+			$this->view->categories = $this->catDAO->listCategories(false);
 			$this->view->feed = new FreshRSS_Feed($url);
 			try {
 				// We try to get some more information about the feed

+ 2 - 1
app/Controllers/indexController.php

@@ -330,7 +330,8 @@ class FreshRSS_index_Controller extends Minz_ActionController {
 	private static function purgeTokens() {
 		$oldest = time() - 2629744;	//1 month	//TODO: Use a configuration instead
 		foreach (new DirectoryIterator(DATA_PATH . '/tokens/') as $fileInfo) {
-			if ($fileInfo->getExtension() === 'txt' && $fileInfo->getMTime() < $oldest) {
+			$extension = pathinfo($fileInfo->getFilename(), PATHINFO_EXTENSION);
+			if ($extension === 'txt' && $fileInfo->getMTime() < $oldest) {
 				@unlink($fileInfo->getPathname());
 			}
 		}

+ 1 - 0
app/Controllers/statsController.php

@@ -21,6 +21,7 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
 		Minz_View::appendScript(Minz_Url::display('/scripts/flotr2.min.js?' . @filemtime(PUBLIC_PATH . '/scripts/flotr2.min.js')));
 		$this->view->repartition = $statsDAO->calculateEntryRepartition();
 		$this->view->count = $statsDAO->calculateEntryCount();
+		$this->view->average = $statsDAO->calculateEntryAverage();
 		$this->view->feedByCategory = $statsDAO->calculateFeedByCategory();
 		$this->view->entryByCategory = $statsDAO->calculateEntryByCategory();
 		$this->view->topFeed = $statsDAO->calculateTopFeed();

+ 2 - 0
app/Models/Feed.php

@@ -288,6 +288,8 @@ class FreshRSS_Feed extends Minz_Model {
 						$content .= '<br /><audio lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
 					} elseif (strpos($mime, 'video/') === 0) {
 						$content .= '<br /><video lazyload="" postpone="" preload="none" src="' . $elink . '" controls="controls" />';
+					} else {
+						unset($elinks[$elink]);
 					}
 				}
 			}

+ 24 - 3
app/Models/StatsDAO.php

@@ -79,6 +79,27 @@ SQL;
 		return $this->convertToSerie($count);
 	}
 
+	/**
+	 * Calculates entry average per day on a 30 days period.
+	 *
+	 * @return integer
+	 */
+	public function calculateEntryAverage() {
+		$period = self::ENTRY_COUNT_PERIOD;
+
+		// Get stats per day for the last 30 days
+		$sql = <<<SQL
+SELECT COUNT(1) / {$period} AS average
+FROM {$this->prefix}entry AS e
+WHERE FROM_UNIXTIME(e.date, '%Y%m%d') BETWEEN DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -{$period} DAY), '%Y%m%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y%m%d')
+SQL;
+		$stm = $this->bd->prepare($sql);
+		$stm->execute();
+		$res = $stm->fetch(PDO::FETCH_NAMED);
+
+		return round($res['average'], 2);
+	}
+
 	/**
 	 * Initialize an array for the entry count.
 	 *
@@ -160,7 +181,7 @@ SQL;
 	public function calculateEntryAveragePerFeedPerHour($feed = null) {
 		return $this->calculateEntryAveragePerFeedPerPeriod(1/24, $feed);
 	}
-	
+
 	/**
 	 * Calculates the average number of article per day of week per feed
 	 *
@@ -180,10 +201,10 @@ SQL;
 	public function calculateEntryAveragePerFeedPerMonth($feed = null) {
 		return $this->calculateEntryAveragePerFeedPerPeriod(30, $feed);
 	}
-	
+
 	/**
 	 * Calculates the average number of article per feed
-	 * 
+	 *
 	 * @param float $period number used to divide the number of day in the period
 	 * @param integer $feed id
 	 * @return integer

+ 23 - 0
app/Models/StatsDAOSQLite.php

@@ -34,6 +34,29 @@ SQL;
 		return $this->convertToSerie($count);
 	}
 
+	/**
+	 * Calculates entry average per day on a 30 days period.
+	 *
+	 * @return integer
+	 */
+	public function calculateEntryAverage() {
+		$period = self::ENTRY_COUNT_PERIOD;
+
+		// Get stats per day for the last 30 days
+		$sql = <<<SQL
+SELECT COUNT(1) / {$period} AS average
+FROM {$this->prefix}entry AS e
+WHERE strftime('%Y%m%d', e.date, 'unixepoch')
+	BETWEEN strftime('%Y%m%d', 'now', '-{$period} days')
+	AND strftime('%Y%m%d', 'now', '-1 day')
+SQL;
+		$stm = $this->bd->prepare($sql);
+		$stm->execute();
+		$res = $stm->fetch(PDO::FETCH_NAMED);
+
+		return round($res['average'], 2);
+	}
+
 	protected function calculateEntryRepartitionPerFeedPerPeriod($period, $feed = null) {
 		if ($feed) {
 			$restrict = "WHERE e.id_feed = {$feed}";

+ 1 - 0
app/i18n/en.php

@@ -56,6 +56,7 @@ return array (
 	'stats_entry_per_hour'		=> 'Per hour',
 	'stats_entry_per_day_of_week'	=> 'Per day of week',
 	'stats_entry_per_month'		=> 'Per month',
+	'stats_percent_of_total'	=> '%% of total',
     
 	'last_week'			=> 'Last week',
 	'last_month'			=> 'Last month',

+ 1 - 0
app/i18n/fr.php

@@ -56,6 +56,7 @@ return array (
 	'stats_entry_per_hour'		=> 'Par heure',
 	'stats_entry_per_day_of_week'	=> 'Par jour de la semaine',
 	'stats_entry_per_month'		=> 'Par mois',
+	'stats_percent_of_total'	=> '%% du total',
 
 	'last_week'			=> 'Depuis la semaine dernière',
 	'last_month'			=> 'Depuis le mois dernier',

+ 5 - 4
app/views/helpers/view/normal_view.phtml

@@ -153,14 +153,15 @@ if (!empty($this->entries)) {
 				if (!empty($tags)) {
 				?><li class="item">
 					<div class="dropdown">
-						<div id="dropdown-tags-<?php echo $item->id ();?>" class="dropdown-target"></div>
-						<a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id ();?>"><?php
-							echo FreshRSS_Themes::icon('tag'), Minz_Translate::t ('related_tags');
+						<div id="dropdown-tags-<?php echo $item->id();?>" class="dropdown-target"></div>
+						<?php echo _i('tag'); ?>
+						<a class="dropdown-toggle" href="#dropdown-tags-<?php echo $item->id();?>"><?php
+							echo _t('related_tags');
 						?></a>
 						<ul class="dropdown-menu">
 							<li class="dropdown-close"><a href="#close">❌</a></li><?php
 							foreach($tags as $tag) {
-								?><li class="item"><a href="<?php echo _url ('index', 'index', 'search', urlencode ('#' . $tag)); ?>"><?php echo $tag; ?></a></li><?php
+								?><li class="item"><a href="<?php echo _url('index', 'index', 'search', urlencode('#' . $tag)); ?>"><?php echo $tag; ?></a></li><?php
 							} ?>
 						</ul>
 					</div>

+ 15 - 3
app/views/stats/index.phtml

@@ -48,6 +48,7 @@
 					<th><?php echo _t ('feed'); ?></th>
 					<th><?php echo _t ('category'); ?></th>
 					<th><?php echo _t ('stats_entry_count'); ?></th>
+					<th><?php echo _t ('stats_percent_of_total'); ?></th>
 				</tr>
 			</thead>
 			<tbody>
@@ -56,6 +57,7 @@
 						<td><a href="<?php echo _url('stats', 'repartition', 'id', $feed['id']); ?>"><?php echo $feed['name']; ?></a></td>
 						<td><?php echo $feed['category']; ?></td>
 						<td class="numeric"><?php echo formatNumber($feed['count']); ?></td>
+						<td class="numeric"><?php echo formatNumber($feed['count'] / $this->repartition['all_feeds']['total'] * 100, 1);?></td>
 					</tr>
 				<?php endforeach;?>
 			</tbody>
@@ -91,12 +93,22 @@ function initStats() {
 		return;
 	}
 	// Entry per day
+	var avg = [];
+	for (var i = -31; i <= 0; i++) {
+		avg.push([i, <?php echo $this->average?>]);
+	}
 	Flotr.draw(document.getElementById('statsEntryPerDay'),
-		[<?php echo $this->count ?>],
+		[{
+			data: <?php echo $this->count ?>,
+			bars: {horizontal: false, show: true}
+		},{
+			data: avg,
+			lines: {show: true},
+			label: "<?php echo $this->average?>"
+		}],
 		{
 			grid: {verticalLines: false},
-			bars: {horizontal: false, show: true},
-			xaxis: {noTicks: 6, showLabels: false, tickDecimals: 0},
+			xaxis: {noTicks: 6, showLabels: false, tickDecimals: 0, min: -30.75, max: -0.25},
 			yaxis: {min: 0},
 			mouse: {relative: true, track: true, trackDecimals: 0, trackFormatter: function(obj) {return numberFormat(obj.y);}}
 		});

+ 3 - 3
app/views/stats/repartition.phtml

@@ -67,7 +67,7 @@ function initStats() {
 		}, {
 			data: avg_h,
 			lines: {show: true},
-			label: <?php echo $this->averageHour?>,
+			label: "<?php echo $this->averageHour?>",
 			yaxis: 2
 		}],
 		{
@@ -96,7 +96,7 @@ function initStats() {
 		}, {
 			data: avg_dow,
 			lines: {show: true},
-			label: <?php echo $this->averageDayOfWeek?>,
+			label: "<?php echo $this->averageDayOfWeek?>",
 			yaxis: 2
 		}],
 		{
@@ -126,7 +126,7 @@ function initStats() {
 		}, {
 			data: avg_m,
 			lines: {show: true},
-			label: <?php echo $this->averageMonth?>,
+			label: "<?php echo $this->averageMonth?>",
 			yaxis: 2
 		}],
 		{

+ 2 - 9
p/scripts/main.js

@@ -33,7 +33,7 @@ function needsScroll($elem) {
 }
 
 function str2int(str) {
-	if (str == '') {
+	if (str == '' || str === undefined) {
 		return 0;
 	}
 	return parseInt(str.replace(/\D/g, ''), 10) || 0;
@@ -538,14 +538,7 @@ function init_shortcuts() {
 	});
 	shortcut.add("shift+" + shortcuts.mark_read, function () {
 		// on marque tout comme lu
-		var btn = $(".nav_menu .read_all");
-		if (btn.hasClass('confirm')) {
-			if (confirm(str_confirmation)) {
-				btn.click();
-			}
-		} else {
-			btn.click();
-		}
+		$(".nav_menu .read_all").click();
 	}, {
 		'disable_in_input': true
 	});