EpisodesView: Create a DieselModel for EpisodeViewWidget.

This commit is contained in:
Jordan Petridis 2017-12-19 11:04:44 +02:00
parent 5220eaceee
commit f602e8c36d
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 66 additions and 17 deletions

View File

@ -2,7 +2,7 @@
use diesel::prelude::*; use diesel::prelude::*;
use diesel; use diesel;
use models::queryables::{Episode, EpisodeWidgetQuery, Podcast, Source}; use models::queryables::{Episode, EpisodeViewWidgetQuery, EpisodeWidgetQuery, Podcast, Source};
use chrono::prelude::*; use chrono::prelude::*;
use errors::*; use errors::*;
@ -84,26 +84,31 @@ pub fn get_episodes_with_limit(limit: u32) -> Result<Vec<Episode>> {
.load::<Episode>(&*con)?) .load::<Episode>(&*con)?)
} }
pub fn get_episodeswidgets_with_limit(limit: u32) -> Result<Vec<EpisodeWidgetQuery>> { pub fn get_episodes_view_widgets_with_limit(limit: u32) -> Result<Vec<EpisodeViewWidgetQuery>> {
use schema::episode::dsl::*; use schema::{episode, podcast};
joinable!(episode -> podcast (rowid));
allow_tables_to_appear_in_same_query!(episode, podcast);
let db = connection(); let db = connection();
let con = db.get()?; let con = db.get()?;
Ok(episode Ok(episode::table
.left_join(podcast::table)
.select(( .select((
rowid, episode::rowid,
title, episode::title,
uri, episode::uri,
local_uri, episode::local_uri,
epoch, episode::epoch,
length, episode::length,
played, episode::played,
podcast_id, episode::podcast_id,
(podcast::image_uri).nullable(),
)) ))
.order(epoch.desc()) .order(episode::epoch.desc())
.limit(i64::from(limit)) .limit(i64::from(limit))
.load::<EpisodeWidgetQuery>(&*con)?) .load::<EpisodeViewWidgetQuery>(&*con)?)
} }
pub fn get_podcast_from_id(pid: i32) -> Result<Podcast> { pub fn get_podcast_from_id(pid: i32) -> Result<Podcast> {

View File

@ -320,6 +320,45 @@ impl EpisodeWidgetQuery {
} }
} }
impl From<EpisodeViewWidgetQuery> for EpisodeWidgetQuery {
fn from(view: EpisodeViewWidgetQuery) -> EpisodeWidgetQuery {
EpisodeWidgetQuery {
rowid: view.rowid,
title: view.title,
uri: view.uri,
local_uri: view.local_uri,
epoch: view.epoch,
length: view.length,
played: view.played,
// favorite: view.favorite,
// archive: view.archive,
podcast_id: view.podcast_id,
}
}
}
#[derive(Queryable, Debug, Clone)]
/// Diesel Model to be used for constructing `EpisodeWidgets`.
pub struct EpisodeViewWidgetQuery {
rowid: i32,
title: String,
uri: Option<String>,
local_uri: Option<String>,
epoch: i32,
length: Option<i32>,
played: Option<i32>,
// favorite: bool,
// archive: bool,
podcast_id: i32,
image_uri: Option<String>,
}
impl EpisodeViewWidgetQuery {
pub fn image_uri(&self) -> Option<&str> {
self.image_uri.as_ref().map(|s| s.as_str())
}
}
#[derive(Queryable, Identifiable, AsChangeset, Associations, PartialEq)] #[derive(Queryable, Identifiable, AsChangeset, Associations, PartialEq)]
#[belongs_to(Source, foreign_key = "source_id")] #[belongs_to(Source, foreign_key = "source_id")]
#[changeset_options(treat_none_as_null = "true")] #[changeset_options(treat_none_as_null = "true")]

View File

@ -14,6 +14,8 @@ use std::path::Path;
use std::fs; use std::fs;
fn download_checker() -> Result<()> { fn download_checker() -> Result<()> {
// TODO: give it it's own diesel model,
// so it does not pull useless and expensive stuff like description.
let episodes = dbqueries::get_downloaded_episodes()?; let episodes = dbqueries::get_downloaded_episodes()?;
episodes episodes
@ -35,6 +37,8 @@ fn checker_helper(ep: &mut Episode) {
} }
fn played_cleaner() -> Result<()> { fn played_cleaner() -> Result<()> {
// TODO: give it it's own diesel model,
// so it does not pull useless and expensive stuff like description.
let episodes = dbqueries::get_played_episodes()?; let episodes = dbqueries::get_played_episodes()?;
let now_utc = Utc::now().timestamp() as i32; let now_utc = Utc::now().timestamp() as i32;

View File

@ -31,7 +31,7 @@ impl EpisodesView {
pub fn new() -> Rc<EpisodesView> { pub fn new() -> Rc<EpisodesView> {
let view = EpisodesView::default(); let view = EpisodesView::default();
let episodes = dbqueries::get_episodeswidgets_with_limit(100).unwrap(); let episodes = dbqueries::get_episodes_view_widgets_with_limit(100).unwrap();
let frame = gtk::Frame::new("Recent Episodes"); let frame = gtk::Frame::new("Recent Episodes");
let list = gtk::ListBox::new(); let list = gtk::ListBox::new();
@ -43,8 +43,9 @@ impl EpisodesView {
list.set_visible(true); list.set_visible(true);
list.set_selection_mode(gtk::SelectionMode::None); list.set_selection_mode(gtk::SelectionMode::None);
episodes.into_iter().for_each(|mut ep| { episodes.into_iter().for_each(|ep| {
let viewep = EpisodesViewWidget::new(&mut ep); info!("{:?}", &ep.image_uri());
let viewep = EpisodesViewWidget::new(&mut ep.into());
list.add(&viewep.container); list.add(&viewep.container);
let sep = gtk::Separator::new(gtk::Orientation::Vertical); let sep = gtk::Separator::new(gtk::Orientation::Vertical);