Handle multiple connections from the demo user

This commit is contained in:
emeric
2018-08-02 12:45:33 +02:00
parent 1caadcd7c5
commit 5c182f2868
6 changed files with 53 additions and 12 deletions
+7
View File
@@ -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)
+1
View File
@@ -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
+9 -3
View File
@@ -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)
+5 -1
View File
@@ -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;
+30 -8
View File
@@ -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());
+1
View File
@@ -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;