aboutsummaryrefslogtreecommitdiff
path: root/app/Models
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-09-26 14:50:33 +0200
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-09-26 14:50:33 +0200
commitf0fb1fbb07347d3a2fd7b853bff1f91807cd2d89 (patch)
tree4566beb83704d5b2bbcb128749da042cdaa4e619 /app/Models
parent94ad9cf073962d9ff8076ef8e0db35e513d565a7 (diff)
parentc14162221365077bcaeecde7127806190490dd58 (diff)
Merge branch 'dev' into beta
Diffstat (limited to 'app/Models')
-rw-r--r--app/Models/Configuration.php39
-rw-r--r--app/Models/Entry.php1
-rw-r--r--app/Models/EntryDAO.php2
-rw-r--r--app/Models/FeedDAO.php2
-rw-r--r--app/Models/StatsDAO.php69
-rw-r--r--app/Models/StatsDAOSQLite.php1
-rw-r--r--app/Models/Themes.php1
7 files changed, 112 insertions, 3 deletions
diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php
index 4c804a9fb..95f819779 100644
--- a/app/Models/Configuration.php
+++ b/app/Models/Configuration.php
@@ -45,6 +45,8 @@ class FreshRSS_Configuration {
'load_more' => 'm',
'auto_share' => 's',
'focus_search' => 'a',
+ 'user_filter' => 'u',
+ 'help' => 'f1',
),
'topline_read' => true,
'topline_favorite' => true,
@@ -58,6 +60,7 @@ class FreshRSS_Configuration {
'bottomline_link' => true,
'sharing' => array(),
'queries' => array(),
+ 'html5_notif_timeout' => 0,
);
private $available_languages = array(
@@ -120,6 +123,16 @@ class FreshRSS_Configuration {
return $this->available_languages;
}
+ public function remove_query_by_get($get) {
+ $final_queries = array();
+ foreach ($this->queries as $key => $query) {
+ if (empty($query['get']) || $query['get'] !== $get) {
+ $final_queries[$key] = $query;
+ }
+ }
+ $this->_queries($final_queries);
+ }
+
public function _language($value) {
if (!isset($this->available_languages[$value])) {
$value = 'en';
@@ -138,7 +151,18 @@ class FreshRSS_Configuration {
}
}
public function _default_view ($value) {
- $this->data['default_view'] = $value === FreshRSS_Entry::STATE_ALL ? FreshRSS_Entry::STATE_ALL : FreshRSS_Entry::STATE_NOT_READ;
+ switch ($value) {
+ case FreshRSS_Entry::STATE_ALL:
+ // left blank on purpose
+ case FreshRSS_Entry::STATE_NOT_READ:
+ // left blank on purpose
+ case FreshRSS_Entry::STATE_STRICT + FreshRSS_Entry::STATE_NOT_READ:
+ $this->data['default_view'] = $value;
+ break;
+ default:
+ $this->data['default_view'] = FreshRSS_Entry::STATE_ALL;
+ break;
+ }
}
public function _display_posts ($value) {
$this->data['display_posts'] = ((bool)$value) && $value !== 'no';
@@ -209,6 +233,7 @@ class FreshRSS_Configuration {
}
public function _sharing ($values) {
$this->data['sharing'] = array();
+ $unique = array();
foreach ($values as $value) {
if (!is_array($value)) {
continue;
@@ -234,7 +259,11 @@ class FreshRSS_Configuration {
$value['name'] = $value['type'];
}
- $this->data['sharing'][] = $value;
+ $json_value = json_encode($value);
+ if (!in_array($json_value, $unique)) {
+ $unique[] = $json_value;
+ $this->data['sharing'][] = $value;
+ }
}
}
public function _queries ($values) {
@@ -261,6 +290,12 @@ class FreshRSS_Configuration {
$this->data['content_width'] = 'thin';
}
}
+
+ public function _html5_notif_timeout ($value) {
+ $value = intval($value);
+ $this->data['html5_notif_timeout'] = $value >= 0 ? $value : 0;
+ }
+
public function _token($value) {
$this->data['token'] = $value;
}
diff --git a/app/Models/Entry.php b/app/Models/Entry.php
index 0bf1f2616..9d7dd5dc4 100644
--- a/app/Models/Entry.php
+++ b/app/Models/Entry.php
@@ -6,6 +6,7 @@ class FreshRSS_Entry extends Minz_Model {
const STATE_NOT_READ = 2;
const STATE_FAVORITE = 4;
const STATE_NOT_FAVORITE = 8;
+ const STATE_STRICT = 16;
private $id = 0;
private $guid;
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 75a8aeba4..c1f87ee34 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -333,6 +333,8 @@ class FreshRSS_EntryDAO extends Minz_ModelPdo {
if ($state & FreshRSS_Entry::STATE_NOT_READ) {
if (!($state & FreshRSS_Entry::STATE_READ)) {
$where .= 'AND e1.is_read=0 ';
+ } elseif ($state & FreshRSS_Entry::STATE_STRICT) {
+ $where .= 'AND e1.is_read=0 ';
}
}
elseif ($state & FreshRSS_Entry::STATE_READ) {
diff --git a/app/Models/FeedDAO.php b/app/Models/FeedDAO.php
index 756b1f008..b89ae2045 100644
--- a/app/Models/FeedDAO.php
+++ b/app/Models/FeedDAO.php
@@ -331,7 +331,7 @@ class FreshRSS_FeedDAO extends Minz_ModelPdo {
$id_max = intval($date_min) . '000000';
$stm->bindParam(':id_feed', $id, PDO::PARAM_INT);
- $stm->bindParam(':id_max', $id_max, PDO::PARAM_INT);
+ $stm->bindParam(':id_max', $id_max, PDO::PARAM_STR);
$stm->bindParam(':keep', $keep, PDO::PARAM_INT);
if ($stm && $stm->execute()) {
diff --git a/app/Models/StatsDAO.php b/app/Models/StatsDAO.php
index 89be76a26..40505ab3e 100644
--- a/app/Models/StatsDAO.php
+++ b/app/Models/StatsDAO.php
@@ -152,6 +152,74 @@ SQL;
}
/**
+ * Calculates the average number of article per hour per feed
+ *
+ * @param integer $feed id
+ * @return integer
+ */
+ public function calculateEntryAveragePerFeedPerHour($feed = null) {
+ return $this->calculateEntryAveragePerFeedPerPeriod(1/24, $feed);
+ }
+
+ /**
+ * Calculates the average number of article per day of week per feed
+ *
+ * @param integer $feed id
+ * @return integer
+ */
+ public function calculateEntryAveragePerFeedPerDayOfWeek($feed = null) {
+ return $this->calculateEntryAveragePerFeedPerPeriod(7, $feed);
+ }
+
+ /**
+ * Calculates the average number of article per month per feed
+ *
+ * @param integer $feed id
+ * @return integer
+ */
+ 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
+ */
+ protected function calculateEntryAveragePerFeedPerPeriod($period, $feed = null) {
+ if ($feed) {
+ $restrict = "WHERE e.id_feed = {$feed}";
+ } else {
+ $restrict = '';
+ }
+ $sql = <<<SQL
+SELECT COUNT(1) AS count
+, MIN(date) AS date_min
+, MAX(date) AS date_max
+FROM {$this->prefix}entry AS e
+{$restrict}
+SQL;
+ $stm = $this->bd->prepare($sql);
+ $stm->execute();
+ $res = $stm->fetch(PDO::FETCH_NAMED);
+ $date_min = new \DateTime();
+ $date_min->setTimestamp($res['date_min']);
+ $date_max = new \DateTime();
+ $date_max->setTimestamp($res['date_max']);
+ $interval = $date_max->diff($date_min, true);
+ $interval_in_days = $interval->format('%a');
+ if ($interval_in_days <= 0) {
+ // Surely only one article.
+ // We will return count / (period/period) == count.
+ $interval_in_days = $period;
+ }
+
+ return round($res['count'] / ($interval_in_days / $period), 2);
+ }
+
+ /**
* Initialize an array for statistics depending on a range
*
* @param integer $min
@@ -247,6 +315,7 @@ SQL;
SELECT MAX(f.id) as id
, MAX(f.name) AS name
, MAX(date) AS last_date
+, COUNT(*) AS nb_articles
FROM {$this->prefix}feed AS f,
{$this->prefix}entry AS e
WHERE f.id = e.id_feed
diff --git a/app/Models/StatsDAOSQLite.php b/app/Models/StatsDAOSQLite.php
index 6cb54ddf6..3b1256de1 100644
--- a/app/Models/StatsDAOSQLite.php
+++ b/app/Models/StatsDAOSQLite.php
@@ -53,6 +53,7 @@ SQL;
$stm->execute();
$res = $stm->fetchAll(PDO::FETCH_NAMED);
+ $repartition = array();
foreach ($res as $value) {
$repartition[(int) $value['period']] = (int) $value['count'];
}
diff --git a/app/Models/Themes.php b/app/Models/Themes.php
index 538eb6554..68fc17a2b 100644
--- a/app/Models/Themes.php
+++ b/app/Models/Themes.php
@@ -96,6 +96,7 @@ class FreshRSS_Themes extends Minz_Model {
'search' => '🔍',
'share' => '♺',
'starred' => '★',
+ 'stats' => '%',
'tag' => '⚐',
'up' => '△',
'view-normal' => '☰',