Handle multiple connections from the demo user
This commit is contained in:
@@ -71,6 +71,13 @@ Playlist::getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user)
|
|||||||
return std::vector<Playlist::pointer>(res.begin(), res.end());
|
return std::vector<Playlist::pointer>(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Playlist::pointer
|
||||||
|
Playlist::getById(Wt::Dbo::Session& session, IdType id)
|
||||||
|
{
|
||||||
|
return session.find<Playlist>().where("id = ?").bind(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist)
|
PlaylistEntry::PlaylistEntry(Wt::Dbo::ptr<Track> track, Wt::Dbo::ptr<Playlist> playlist)
|
||||||
: _track(track),
|
: _track(track),
|
||||||
_playlist(playlist)
|
_playlist(playlist)
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class Playlist : public Wt::Dbo::Dbo<Playlist>
|
|||||||
|
|
||||||
// Search utility
|
// Search utility
|
||||||
static pointer get(Wt::Dbo::Session& session, std::string name, Wt::Dbo::ptr<User> user);
|
static pointer get(Wt::Dbo::Session& session, std::string name, Wt::Dbo::ptr<User> user);
|
||||||
|
static pointer getById(Wt::Dbo::Session& session, IdType playlistId);
|
||||||
static std::vector<pointer> getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user);
|
static std::vector<pointer> getAll(Wt::Dbo::Session& session, Wt::Dbo::ptr<User> user);
|
||||||
|
|
||||||
// Create utility
|
// Create utility
|
||||||
|
|||||||
@@ -131,7 +131,8 @@ LmsApplication::LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnecti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LmsApplication::~LmsApplication()
|
void
|
||||||
|
LmsApplication::finalize()
|
||||||
{
|
{
|
||||||
LmsApplicationInfo info = LmsApplicationInfo::fromEnvironment(environment());
|
LmsApplicationInfo info = LmsApplicationInfo::fromEnvironment(environment());
|
||||||
|
|
||||||
@@ -141,6 +142,8 @@ LmsApplication::~LmsApplication()
|
|||||||
});
|
});
|
||||||
|
|
||||||
getApplicationGroup().leave();
|
getApplicationGroup().leave();
|
||||||
|
|
||||||
|
preQuit().emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Wt::WAnchor>
|
std::unique_ptr<Wt::WAnchor>
|
||||||
@@ -456,8 +459,11 @@ LmsApplication::createHome()
|
|||||||
_groupEvents.appOpen.connect([=] (LmsApplicationInfo info)
|
_groupEvents.appOpen.connect([=] (LmsApplicationInfo info)
|
||||||
{
|
{
|
||||||
// Only one active session by user
|
// Only one active session by user
|
||||||
setConfirmCloseMessage("");
|
if (!LmsApp->getUser()->isDemo())
|
||||||
quit(Wt::WString::tr("Lms.quit-other-session"));
|
{
|
||||||
|
setConfirmCloseMessage("");
|
||||||
|
quit(Wt::WString::tr("Lms.quit-other-session"));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
_groupEvents.appClosed.connect([=] (LmsApplicationInfo info)
|
_groupEvents.appClosed.connect([=] (LmsApplicationInfo info)
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ class LmsApplication : public Wt::WApplication
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
LmsApplication(const Wt::WEnvironment& env, Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
||||||
~LmsApplication();
|
|
||||||
|
|
||||||
static std::unique_ptr<Wt::WApplication> create(const Wt::WEnvironment& env,
|
static std::unique_ptr<Wt::WApplication> create(const Wt::WEnvironment& env,
|
||||||
Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
Wt::Dbo::SqlConnectionPool& connectionPool, LmsApplicationGroupContainer& appGroups, Scanner::MediaScanner& scanner);
|
||||||
@@ -77,6 +76,9 @@ class LmsApplication : public Wt::WApplication
|
|||||||
static std::unique_ptr<Wt::WAnchor> createReleaseAnchor(Database::Release::pointer release, bool addText = true);
|
static std::unique_ptr<Wt::WAnchor> createReleaseAnchor(Database::Release::pointer release, bool addText = true);
|
||||||
static std::unique_ptr<Wt::WTemplate> createCluster(Database::Cluster::pointer cluster, bool canDelete = false);
|
static std::unique_ptr<Wt::WTemplate> createCluster(Database::Cluster::pointer cluster, bool canDelete = false);
|
||||||
|
|
||||||
|
// Signal emitted just before the session ends (user may already be logged out)
|
||||||
|
Wt::Signal<>& preQuit() { return _preQuit; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
LmsApplicationGroup& getApplicationGroup();
|
LmsApplicationGroup& getApplicationGroup();
|
||||||
@@ -84,9 +86,11 @@ class LmsApplication : public Wt::WApplication
|
|||||||
// Events
|
// Events
|
||||||
void handleAuthEvent();
|
void handleAuthEvent();
|
||||||
void notify(const Wt::WEvent& event) override;
|
void notify(const Wt::WEvent& event) override;
|
||||||
|
void finalize() override;
|
||||||
|
|
||||||
void createHome();
|
void createHome();
|
||||||
|
|
||||||
|
Wt::Signal<> _preQuit;
|
||||||
Database::Handler _db;
|
Database::Handler _db;
|
||||||
LmsApplicationGroupContainer& _appGroups;
|
LmsApplicationGroupContainer& _appGroups;
|
||||||
GroupEvents _groupEvents;
|
GroupEvents _groupEvents;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "LmsApplication.hpp"
|
#include "LmsApplication.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace UserInterface {
|
namespace UserInterface {
|
||||||
|
|
||||||
PlayQueue::PlayQueue()
|
PlayQueue::PlayQueue()
|
||||||
@@ -50,15 +51,8 @@ PlayQueue::PlayQueue()
|
|||||||
|
|
||||||
Wt::WText* shuffleBtn = bindNew<Wt::WText>("shuffle-btn", Wt::WString::tr("Lms.PlayQueue.shuffle"), Wt::TextFormat::XHTML);
|
Wt::WText* shuffleBtn = bindNew<Wt::WText>("shuffle-btn", Wt::WString::tr("Lms.PlayQueue.shuffle"), Wt::TextFormat::XHTML);
|
||||||
_radioMode = bindNew<Wt::WCheckBox>("radio-mode", Wt::WString::tr("Lms.PlayQueue.radio-mode"));
|
_radioMode = bindNew<Wt::WCheckBox>("radio-mode", Wt::WString::tr("Lms.PlayQueue.radio-mode"));
|
||||||
|
|
||||||
_nbTracks = bindNew<Wt::WText>("nb-tracks");
|
_nbTracks = bindNew<Wt::WText>("nb-tracks");
|
||||||
|
|
||||||
{
|
|
||||||
Wt::Dbo::Transaction transaction (LmsApp->getDboSession());
|
|
||||||
|
|
||||||
_trackPos = LmsApp->getUser()->getCurPlayingTrackPos();
|
|
||||||
}
|
|
||||||
|
|
||||||
clearBtn->clicked().connect([=]
|
clearBtn->clicked().connect([=]
|
||||||
{
|
{
|
||||||
clearTracks();
|
clearTracks();
|
||||||
@@ -80,6 +74,20 @@ PlayQueue::PlayQueue()
|
|||||||
addSome();
|
addSome();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
LmsApp->preQuit().connect([=]
|
||||||
|
{
|
||||||
|
if (_playlistId)
|
||||||
|
{
|
||||||
|
LMS_LOG(UI, DEBUG) << "Removing playlist id " << *_playlistId;
|
||||||
|
|
||||||
|
Wt::Dbo::Transaction transaction(LmsApp->getDboSession());
|
||||||
|
|
||||||
|
auto playlist = Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId);
|
||||||
|
if (playlist)
|
||||||
|
playlist.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
updateInfo();
|
updateInfo();
|
||||||
addSome();
|
addSome();
|
||||||
}
|
}
|
||||||
@@ -88,8 +96,22 @@ Database::Playlist::pointer
|
|||||||
PlayQueue::getPlaylist()
|
PlayQueue::getPlaylist()
|
||||||
{
|
{
|
||||||
static const std::string currentPlayQueueName = "__current__playqueue__";
|
static const std::string currentPlayQueueName = "__current__playqueue__";
|
||||||
|
Database::Playlist::pointer res;
|
||||||
|
|
||||||
Database::Playlist::pointer res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser());
|
if (LmsApp->getUser()->isDemo())
|
||||||
|
{
|
||||||
|
if (!_playlistId)
|
||||||
|
{
|
||||||
|
res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser());
|
||||||
|
LmsApp->getDboSession().flush();
|
||||||
|
_playlistId = res.id();
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Database::Playlist::getById(LmsApp->getDboSession(), *_playlistId);
|
||||||
|
}
|
||||||
|
|
||||||
|
res = Database::Playlist::get(LmsApp->getDboSession(), currentPlayQueueName, LmsApp->getUser());
|
||||||
if (!res)
|
if (!res)
|
||||||
res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser());
|
res = Database::Playlist::create(LmsApp->getDboSession(), currentPlayQueueName, false, LmsApp->getUser());
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ class PlayQueue : public Wt::WTemplate
|
|||||||
void play(std::size_t pos);
|
void play(std::size_t pos);
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
boost::optional<Database::IdType> _playlistId;
|
||||||
Wt::WCheckBox* _radioMode;
|
Wt::WCheckBox* _radioMode;
|
||||||
Wt::WContainerWidget* _entriesContainer;
|
Wt::WContainerWidget* _entriesContainer;
|
||||||
Wt::WTemplate* _showMore;
|
Wt::WTemplate* _showMore;
|
||||||
|
|||||||
Reference in New Issue
Block a user