Now the dayChange time is taken into account. This fixes #43.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 30 Apr 2013 21:42:38 +0000 (21:42 +0000)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Tue, 30 Apr 2013 21:42:38 +0000 (21:42 +0000)
src/mvc/conference.h
src/mvc/event.cpp
src/mvc/eventmodel.cpp
src/sql/sqlengine.cpp

index 2da6c24..51dee99 100644 (file)
@@ -49,6 +49,7 @@ public:
     QDate start() const { return value("start").toDate(); }
     QDate end() const { return value("end").toDate(); }
     int dayChange() const { return value("day_change").toInt(); } // in seconds from 00:00
+    QTime dayChangeTime() const {QTime dayChangeTime(0, 0); return dayChangeTime.addSecs(dayChange());}
     int timeslotDuration() const { return value("timeslot_duration").toInt(); } // in seconds
     bool isActive() const { return value("active").toBool(); }
     QString url() const { return stringFromNullable(value("url")); }
index 3e49764..c8cc349 100644 (file)
@@ -17,6 +17,7 @@
  * You should have received a copy of the GNU General Public License along with
  * ConfClerk.  If not, see <http://www.gnu.org/licenses/>.
  */
+#include "conference.h"
 #include "event.h"
 #include "room.h"
 
@@ -53,24 +54,30 @@ Event Event::getById(int id, int conferenceId) {
 
 
 QList<Event> Event::getByDate(const QDate& date, int conferenceId, QString orderBy) {
+    Q_ASSERT(conferenceId > 0);
+    Conference conference = Conference::getById(conferenceId);
+    QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC);
     QSqlQuery query;
     query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end ORDER BY %1").arg(orderBy));
     query.bindValue(":conf", conferenceId);
-    query.bindValue(":start", convertToDb(date, QVariant::DateTime));
-    query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime));
+    query.bindValue(":start", dayStart.toTime_t());
+    query.bindValue(":end", dayStart.addDays(1).toTime_t());
     return load(query);
 }
 
-QList<Event> Event::getByDateAndRoom(const QDate& date, int conferenceId)
-{
+
+QList<Event> Event::getByDateAndRoom(const QDate& date, int conferenceId) {
+    Q_ASSERT(conferenceId > 0);
+    Conference conference = Conference::getById(conferenceId);
+    QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC);
     QSqlQuery query;
     QString aliasEvent("E");
     QString aliasEventRoom("R");
     query.prepare(QString("SELECT %1 FROM %2 %3, %4 %5 WHERE %3.xid_conference = :conf AND %3.start >= :start AND %3.start < :end AND %3.id = R.xid_event ORDER BY %5.xid_room, %3.start, %3.duration").arg(
                     columnsForSelect(aliasEvent), Event::sTableName, aliasEvent, "EVENT_ROOM", aliasEventRoom));
     query.bindValue(":conf", conferenceId);
-    query.bindValue(":start", convertToDb(date, QVariant::DateTime));
-    query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime));
+    query.bindValue(":start", dayStart.toTime_t());
+    query.bindValue(":end", dayStart.addDays(1).toTime_t());
 
     return load(query);
 }
@@ -103,13 +110,15 @@ QList<Event> Event::getImminentAlarmEvents(int maxSecToAlarm, int conferenceId)
 }
 
 
-QList<Event> Event::getFavByDate(const QDate& date, int conferenceId)
-{
+QList<Event> Event::getFavByDate(const QDate& date, int conferenceId) {
+    Q_ASSERT(conferenceId > 0);
+    Conference conference = Conference::getById(conferenceId);
+    QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC);
     QSqlQuery query;
     query.prepare(selectQuery() + QString("WHERE xid_conference = :conf AND start >= :start AND start < :end AND favourite = 1 ORDER BY start, duration"));
     query.bindValue(":conf", conferenceId);
-    query.bindValue(":start", convertToDb(date, QVariant::DateTime));
-    query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime));
+    query.bindValue(":start", dayStart.toTime_t());
+    query.bindValue(":end", dayStart.addDays(1).toTime_t());
 
     return load(query);
 }
@@ -236,9 +245,13 @@ QList<Event> Event::getSearchResultByDate(const QDate& date, int conferenceId, Q
             throw OrmSqlException( query.lastError().text() );
         }
 
+        Q_ASSERT(conferenceId > 0);
+        Conference conference = Conference::getById(conferenceId);
+        QDateTime dayStart(date, conference.dayChangeTime(), Qt::UTC);
+
         query.bindValue(":conf", conferenceId);
-        query.bindValue(":start", convertToDb(date, QVariant::DateTime));
-        query.bindValue(":end", convertToDb(date.addDays(1), QVariant::DateTime));
+        query.bindValue(":start", dayStart.toTime_t());
+        query.bindValue(":end", dayStart.addDays(1).toTime_t());
 
         list = load(query);
     }
index 8ffb1b4..139d330 100644 (file)
@@ -29,10 +29,10 @@ EventModel::EventModel()
 
 
 void EventModel::Group::setTitle(const QList<Event>& mEvents) {
-    QTime startTime = mEvents.at(mFirstEventIndex).start().time();
-    QTime endTime(0, 0);
+    QDateTime startTime = mEvents.at(mFirstEventIndex).start();
+    QDateTime endTime(startTime);
     for (int i = mFirstEventIndex; i != mFirstEventIndex + mChildCount; ++i) {
-        endTime = qMax(mEvents.at(i).start().time().addSecs(mEvents.at(i).duration()), endTime);
+        endTime = qMax(mEvents.at(i).start().addSecs(mEvents.at(i).duration()), endTime);
     }
     mTitle = QString("%1 - %2").arg(startTime.toString("HH:mm")).arg(endTime.toString("HH:mm"));
 }
@@ -235,44 +235,31 @@ void EventModel::clearModel()
     reset();
 }
 
-void EventModel::loadEvents(const QDate &aDate, int aConferenceId)
-{
+
+void EventModel::loadEvents(const QDate &aDate, int aConferenceId) {
     clearModel();
-    // check for existence of the conference in the DB
-    if(Conference::getAll().count())
-    {
-        mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration");
-    }
+    mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration");
     createTimeGroups();
 }
 
-void EventModel::loadFavEvents(const QDate &aDate, int aConferenceId)
-{
+
+void EventModel::loadFavEvents(const QDate &aDate, int aConferenceId) {
     clearModel();
-    // check for existence of the conference in the DB
-    if(Conference::getAll().count())
-    {
-        mEvents = Event::getFavByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
-    }
+    mEvents = Event::getFavByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
     createTimeGroups();
 }
 
-int EventModel::loadSearchResultEvents(const QDate &aDate, int aConferenceId)
-{
-    clearModel();
-    // check for existence of the conference in the DB
-    if(Conference::getAll().count())
-    {
-        try{
-            mEvents = Event::getSearchResultByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration");
-        }
-        catch( OrmException &e  ){
-            qDebug() << "Event::getSearchResultByDate failed: " << e.text();
-        }
-        catch(...){
-            qDebug() << "Event::getSearchResultByDate failed";
-        }
 
+int EventModel::loadSearchResultEvents(const QDate &aDate, int aConferenceId) {
+    clearModel();
+    try {
+        mEvents = Event::getSearchResultByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "start, duration");
+    }
+    catch( OrmException &e  ){
+        qDebug() << "Event::getSearchResultByDate failed: " << e.text();
+    }
+    catch(...){
+        qDebug() << "Event::getSearchResultByDate failed";
     }
 
     createTimeGroups();
@@ -280,37 +267,28 @@ int EventModel::loadSearchResultEvents(const QDate &aDate, int aConferenceId)
     return mEvents.count();
 }
 
-void EventModel::loadEventsByTrack(const QDate &aDate, int aConferenceId)
-{
+
+void EventModel::loadEventsByTrack(const QDate &aDate, int aConferenceId) {
     clearModel();
-    if (Conference::getAll().count())
-    {
-        mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "xid_track, start, duration");
-    }
+    mEvents = Event::getByDate(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId, "xid_track, start, duration");
     createTrackGroups();
 }
 
-void EventModel::loadEventsByRoom(const QDate &aDate, int aConferenceId)
-{
+
+void EventModel::loadEventsByRoom(const QDate &aDate, int aConferenceId) {
     clearModel();
-    if (Conference::getAll().count())
-    {
-        mEvents = Event::getByDateAndRoom(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
-    }
+    mEvents = Event::getByDateAndRoom(QDate(aDate.year(), aDate.month(), aDate.day()), aConferenceId);
     createRoomGroups();
 }
 
 
 void EventModel::loadConflictEvents(int aEventId, int aConferenceId) {
     clearModel();
-    // check for existence of the conference in the DB
-    if(Conference::getAll().count())
-    {
-        mEvents = Event::conflictEvents(aEventId, aConferenceId);
-    }
+    mEvents = Event::conflictEvents(aEventId, aConferenceId);
     createTimeGroups();
 }
 
+
 void EventModel::updateModel(int aEventId)
 {
     for(int i=0; i<mEvents.count(); i++)
index 88ebc1f..823a2b6 100644 (file)
@@ -172,24 +172,30 @@ void SqlEngine::addConferenceToDB(QHash<QString,QString> &aConference, int confe
 
 
 void SqlEngine::addEventToDB(QHash<QString,QString> &aEvent) {
-    //insert event track to table and get track id
-    int conference = aEvent["conference_id"].toInt();
-    QString name = aEvent["track"];
+    int conferenceId = aEvent["conference_id"].toInt();
+    Conference conference = Conference::getById(conferenceId);
+
+    // insert event track to table and get track id
     Track track;
     int trackId;
+    QString trackName = aEvent["track"];
     try
     {
-        track = Track::retrieveByName(conference, name);
+        track = Track::retrieveByName(conferenceId, trackName);
         trackId = track.id();
     }
     catch (OrmNoObjectException &e) {
-        track.setConference(conference);
-        track.setName(name);
+        track.setConference(conferenceId);
+        track.setName(trackName);
         trackId = track.insert();
     }
+    QDate startDate = QDate::fromString(aEvent["date"], DATE_FORMAT);
+    QTime startTime = QTime::fromString(aEvent["start"], TIME_FORMAT);
+    // consider day_change (note that if day_change is e.g. at 04:00 AM, an event starting at 02:00 AM has the previous date in the XML file)
+    if (startTime < conference.dayChangeTime()) startDate = startDate.addDays(1);
     QDateTime startDateTime;
     startDateTime.setTimeSpec(Qt::UTC);
-    startDateTime = QDateTime(QDate::fromString(aEvent["date"],DATE_FORMAT),QTime::fromString(aEvent["start"],TIME_FORMAT),Qt::UTC);
+    startDateTime = QDateTime(startDate, startTime, Qt::UTC);
 
     bool event_exists = false;
     {