diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a1b7ba3b1bf3dabfa0f0ec176dbe3d8539879b40..65fe3181f871f91b5d06186af22d518418fd0e3b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,17 +6,10 @@ </component> <component name="ChangeListManager"> <list default="true" id="c58ca86a-4167-4474-accb-41439a535514" name="Default" comment=""> - <change beforePath="" afterPath="$PROJECT_DIR$/libraries/database/trackservice.py" /> - <change beforePath="" afterPath="$PROJECT_DIR$/modules/web/routes.py" /> - <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> - <change beforePath="$PROJECT_DIR$/aura.py" afterPath="$PROJECT_DIR$/aura.py" /> - <change beforePath="$PROJECT_DIR$/libraries/base/calendar.py" afterPath="$PROJECT_DIR$/libraries/base/calendar.py" /> <change beforePath="$PROJECT_DIR$/libraries/database/broadcasts.py" afterPath="$PROJECT_DIR$/libraries/database/broadcasts.py" /> - <change beforePath="$PROJECT_DIR$/libraries/database/database.py" afterPath="$PROJECT_DIR$/libraries/database/database.py" /> <change beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> - <change beforePath="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" afterPath="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" /> + <change beforePath="$PROJECT_DIR$/modules/controller/controller.py" afterPath="$PROJECT_DIR$/modules/controller/controller.py" /> <change beforePath="$PROJECT_DIR$/modules/scheduling/scheduler.py" afterPath="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> - <change beforePath="$PROJECT_DIR$/modules/tools/padavan.py" afterPath="$PROJECT_DIR$/modules/tools/padavan.py" /> </list> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="TRACKING_ENABLED" value="true" /> @@ -27,45 +20,25 @@ </component> <component name="FileEditorManager"> <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> - <file leaf-file-name="adapter.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/modules/communication/redis/adapter.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="221"> - <caret line="132" column="82" lean-forward="false" selection-start-line="132" selection-start-column="82" selection-end-line="132" selection-end-column="82" /> - <folding /> - </state> - </provider> - </entry> - </file> <file leaf-file-name="controller.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="147"> - <caret line="61" column="0" lean-forward="false" selection-start-line="61" selection-start-column="0" selection-end-line="61" selection-end-column="0" /> - <folding /> - </state> - </provider> - </entry> - </file> - <file leaf-file-name="broadcasts.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="68"> - <caret line="130" column="24" lean-forward="true" selection-start-line="130" selection-start-column="24" selection-end-line="130" selection-end-column="24" /> + <state relative-caret-position="128"> + <caret line="73" column="26" lean-forward="true" selection-start-line="73" selection-start-column="26" selection-end-line="73" selection-end-column="26" /> <folding> - <element signature="e#43#75#0" expanded="true" /> + <element signature="e#43#56#0" expanded="true" /> </folding> </state> </provider> </entry> </file> - <file leaf-file-name="aura.py" pinned="false" current-in-tab="false"> - <entry file="file://$PROJECT_DIR$/aura.py"> + <file leaf-file-name="broadcasts.py" pinned="false" current-in-tab="true"> + <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="306"> - <caret line="27" column="33" lean-forward="true" selection-start-line="27" selection-start-column="33" selection-end-line="27" selection-end-column="33" /> + <state relative-caret-position="403"> + <caret line="257" column="114" lean-forward="true" selection-start-line="257" selection-start-column="114" selection-end-line="257" selection-end-column="114" /> <folding> - <element signature="e#0#13#0" expanded="true" /> + <element signature="e#43#75#0" expanded="true" /> </folding> </state> </provider> @@ -86,20 +59,28 @@ <file leaf-file-name="scheduler.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="488"> - <caret line="751" column="0" lean-forward="false" selection-start-line="751" selection-start-column="0" selection-end-line="751" selection-end-column="0" /> - <folding> - <element signature="e#1093#1106#0" expanded="true" /> - </folding> + <state relative-caret-position="179"> + <caret line="54" column="84" lean-forward="false" selection-start-line="54" selection-start-column="84" selection-end-line="54" selection-end-column="84" /> + <folding /> + </state> + </provider> + </entry> + </file> + <file leaf-file-name="guru.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/guru.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="557"> + <caret line="56" column="163" lean-forward="false" selection-start-line="56" selection-start-column="163" selection-end-line="56" selection-end-column="163" /> + <folding /> </state> </provider> </entry> </file> - <file leaf-file-name="calendar.py" pinned="false" current-in-tab="true"> + <file leaf-file-name="calendar.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/libraries/base/calendar.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="6458"> - <caret line="410" column="32" lean-forward="true" selection-start-line="410" selection-start-column="32" selection-end-line="410" selection-end-column="32" /> + <state relative-caret-position="111"> + <caret line="194" column="8" lean-forward="false" selection-start-line="194" selection-start-column="8" selection-end-line="199" selection-end-column="44" /> <folding /> </state> </provider> @@ -115,12 +96,24 @@ </provider> </entry> </file> + <file leaf-file-name="messenger.py" pinned="false" current-in-tab="false"> + <entry file="file://$PROJECT_DIR$/modules/communication/redis/messenger.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="414"> + <caret line="272" column="75" lean-forward="true" selection-start-line="272" selection-start-column="75" selection-end-line="272" selection-end-column="75" /> + <folding /> + </state> + </provider> + </entry> + </file> <file leaf-file-name="communicator.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="105"> - <caret line="104" column="33" lean-forward="true" selection-start-line="104" selection-start-column="33" selection-end-line="104" selection-end-column="33" /> - <folding /> + <state relative-caret-position="230"> + <caret line="135" column="0" lean-forward="true" selection-start-line="135" selection-start-column="0" selection-end-line="135" selection-end-column="0" /> + <folding> + <element signature="e#0#9#0" expanded="true" /> + </folding> </state> </provider> </entry> @@ -128,8 +121,8 @@ <file leaf-file-name="padavan.py" pinned="false" current-in-tab="false"> <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="255"> - <caret line="119" column="54" lean-forward="false" selection-start-line="119" selection-start-column="54" selection-end-line="119" selection-end-column="54" /> + <state relative-caret-position="431"> + <caret line="194" column="32" lean-forward="true" selection-start-line="194" selection-start-column="32" selection-end-line="194" selection-end-column="32" /> <folding> <element signature="e#0#17#0" expanded="true" /> </folding> @@ -148,14 +141,6 @@ </component> <component name="FindInProjectRecents"> <findStrings> - <find>entrynumber</find> - <find>Model.</find> - <find>self.programme</find> - <find>recreate_</find> - <find>entryn</find> - <find>alchem</find> - <find>liqu</find> - <find>scheduler</find> <find>get_jobs</find> <find>__load_</find> <find>lookup_prearranged</find> @@ -174,10 +159,18 @@ <find>stop_playlist</find> <find>say_alive</find> <find>get_info</find> - <find>MessageT</find> <find>__set_url__</find> <find>get_data</find> + <find>MessageT</find> + <find>fetch</find> + <find>/1</find> + <find>recreate_</find> + <find>create_from_</find> + <find>track</find> + <find>creating</find> <find>stop</find> + <find>debug</find> + <find>string(</find> </findStrings> <replaceStrings> <replace>"</replace> @@ -228,7 +221,6 @@ <option value="$PROJECT_DIR$/modules/liquidsoap/simplestmixer.liq" /> <option value="$PROJECT_DIR$/README.md" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/client.py" /> - <option value="$PROJECT_DIR$/modules/controller/controller.py" /> <option value="$PROJECT_DIR$/libraries/enum/redischannels.py" /> <option value="$PROJECT_DIR$/modules/communication/redis/messenger.py" /> <option value="$PROJECT_DIR$/guru.py" /> @@ -238,11 +230,12 @@ <option value="$PROJECT_DIR$/aura.py" /> <option value="$PROJECT_DIR$/libraries/database/trackservice.py" /> <option value="$PROJECT_DIR$/modules/communication/liquidsoap/initthread.py" /> - <option value="$PROJECT_DIR$/libraries/database/broadcasts.py" /> - <option value="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> <option value="$PROJECT_DIR$/modules/tools/padavan.py" /> - <option value="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> <option value="$PROJECT_DIR$/libraries/base/calendar.py" /> + <option value="$PROJECT_DIR$/modules/controller/controller.py" /> + <option value="$PROJECT_DIR$/modules/scheduling/scheduler.py" /> + <option value="$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py" /> + <option value="$PROJECT_DIR$/libraries/database/broadcasts.py" /> </list> </option> </component> @@ -452,7 +445,6 @@ </component> <component name="ToolWindowManager"> <frame x="645" y="31" width="1926" height="1052" extended-state="6" /> - <editor active="true" /> <layout> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.16640337" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> @@ -460,7 +452,7 @@ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.43275487" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32936078" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" /> - <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3275488" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> + <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3275488" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="11" side_tool="false" content_ui="tabs" /> <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" /> @@ -513,7 +505,7 @@ <breakpoints> <line-breakpoint enabled="true" suspend="THREAD" type="python-line"> <url>file://$PROJECT_DIR$/modules/scheduling/scheduler.py</url> - <line>411</line> + <line>413</line> <option name="timeStamp" value="35" /> </line-breakpoint> </breakpoints> @@ -678,22 +670,6 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/redis/messenger.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="255"> - <caret line="22" column="40" lean-forward="false" selection-start-line="22" selection-start-column="40" selection-end-line="22" selection-end-column="40" /> - <folding /> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/guru.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="799"> - <caret line="56" column="163" lean-forward="false" selection-start-line="56" selection-start-column="163" selection-end-line="56" selection-end-column="163" /> - <folding /> - </state> - </provider> - </entry> <entry file="file://$PROJECT_DIR$/libraries/database/combadb.py"> <provider selected="true" editor-type-id="text-editor"> <state relative-caret-position="0"> @@ -723,7 +699,7 @@ <state relative-caret-position="119"> <caret line="7" column="0" lean-forward="false" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" /> <folding> - <element signature="e#43#145#0" expanded="true" /> + <element signature="e#43#145#0" expanded="false" /> </folding> </state> </provider> @@ -741,7 +717,7 @@ <state relative-caret-position="306"> <caret line="27" column="33" lean-forward="true" selection-start-line="27" selection-start-column="33" selection-end-line="27" selection-end-column="33" /> <folding> - <element signature="e#0#13#0" expanded="true" /> + <element signature="e#0#13#0" expanded="false" /> </folding> </state> </provider> @@ -754,77 +730,95 @@ </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/database.py"> + <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="465"> - <caret line="30" column="0" lean-forward="false" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" /> + <state relative-caret-position="128"> + <caret line="73" column="26" lean-forward="true" selection-start-line="73" selection-start-column="26" selection-end-line="73" selection-end-column="26" /> <folding> - <element signature="e#0#55#0" expanded="true" /> + <element signature="e#43#56#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> - <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="68"> - <caret line="130" column="24" lean-forward="true" selection-start-line="130" selection-start-column="24" selection-end-line="130" selection-end-column="24" /> - <folding> - <element signature="e#43#75#0" expanded="true" /> - </folding> - </state> - </provider> - </entry> - <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> + <entry file="file://$PROJECT_DIR$/libraries/base/schedulerconfig.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="105"> - <caret line="104" column="33" lean-forward="true" selection-start-line="104" selection-start-column="33" selection-end-line="104" selection-end-column="33" /> + <state relative-caret-position="-313"> + <caret line="32" column="8" lean-forward="false" selection-start-line="32" selection-start-column="8" selection-end-line="32" selection-end-column="8" /> <folding /> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/modules/controller/controller.py"> + <entry file="file://$PROJECT_DIR$/guru.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="147"> - <caret line="61" column="0" lean-forward="false" selection-start-line="61" selection-start-column="0" selection-end-line="61" selection-end-column="0" /> + <state relative-caret-position="557"> + <caret line="56" column="163" lean-forward="false" selection-start-line="56" selection-start-column="163" selection-end-line="56" selection-end-column="163" /> <folding /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/modules/tools/padavan.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="255"> - <caret line="119" column="54" lean-forward="false" selection-start-line="119" selection-start-column="54" selection-end-line="119" selection-end-column="54" /> + <state relative-caret-position="431"> + <caret line="194" column="32" lean-forward="true" selection-start-line="194" selection-start-column="32" selection-end-line="194" selection-end-column="32" /> <folding> <element signature="e#0#17#0" expanded="true" /> </folding> </state> </provider> </entry> - <entry file="file://$PROJECT_DIR$/libraries/base/schedulerconfig.py"> + <entry file="file://$PROJECT_DIR$/modules/communication/redis/messenger.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="-313"> - <caret line="32" column="8" lean-forward="false" selection-start-line="32" selection-start-column="8" selection-end-line="32" selection-end-column="8" /> + <state relative-caret-position="414"> + <caret line="272" column="75" lean-forward="true" selection-start-line="272" selection-start-column="75" selection-end-line="272" selection-end-column="75" /> <folding /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/modules/scheduling/scheduler.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="488"> - <caret line="751" column="0" lean-forward="false" selection-start-line="751" selection-start-column="0" selection-end-line="751" selection-end-column="0" /> - <folding> - <element signature="e#1093#1106#0" expanded="true" /> - </folding> + <state relative-caret-position="179"> + <caret line="54" column="84" lean-forward="false" selection-start-line="54" selection-start-column="84" selection-end-line="54" selection-end-column="84" /> + <folding /> </state> </provider> </entry> <entry file="file://$PROJECT_DIR$/libraries/base/calendar.py"> <provider selected="true" editor-type-id="text-editor"> - <state relative-caret-position="6458"> - <caret line="410" column="32" lean-forward="true" selection-start-line="410" selection-start-column="32" selection-end-line="410" selection-end-column="32" /> + <state relative-caret-position="111"> + <caret line="194" column="8" lean-forward="false" selection-start-line="194" selection-start-column="8" selection-end-line="199" selection-end-column="44" /> <folding /> </state> </provider> </entry> + <entry file="file://$PROJECT_DIR$/modules/communication/liquidsoap/communicator.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="230"> + <caret line="135" column="0" lean-forward="true" selection-start-line="135" selection-start-column="0" selection-end-line="135" selection-end-column="0" /> + <folding> + <element signature="e#0#9#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/libraries/database/database.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="465"> + <caret line="30" column="0" lean-forward="false" selection-start-line="30" selection-start-column="0" selection-end-line="30" selection-end-column="0" /> + <folding> + <element signature="e#0#55#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> + <entry file="file://$PROJECT_DIR$/libraries/database/broadcasts.py"> + <provider selected="true" editor-type-id="text-editor"> + <state relative-caret-position="403"> + <caret line="257" column="114" lean-forward="true" selection-start-line="257" selection-start-column="114" selection-end-line="257" selection-end-column="114" /> + <folding> + <element signature="e#43#75#0" expanded="true" /> + </folding> + </state> + </provider> + </entry> </component> </project> \ No newline at end of file diff --git a/libraries/database/broadcasts.py b/libraries/database/broadcasts.py index 6300df1a6c33ceb65a4788d3481d5521d94efe29..579c874eee93b846fc3e22115c1d21dd89656395 100644 --- a/libraries/database/broadcasts.py +++ b/libraries/database/broadcasts.py @@ -5,12 +5,12 @@ import datetime, os, urllib, sys import time import decimal -from sqlalchemy import Boolean, Column, Date, DateTime, Float, Integer, String, Text, Time, ForeignKey +from sqlalchemy import Boolean, Column, Date, DateTime, Float, Integer, String, Text, Time, ForeignKey, ForeignKeyConstraint from sqlalchemy.orm import relationship from libraries.database.database import db -class Model: +class AuraDatabaseModel: def store(self, commit=False): obj_session = db.session.object_session(self) if obj_session is not None: @@ -42,12 +42,16 @@ class Model: manualschedule = Schedule() manualschedule.schedule_id = 0 + fallback_trackservice_schedule = TrackServiceSchedule() + fallback_trackservice_schedule.ts_schedule_id = 0 + print("Recreating Database...") db.drop_all() print("all dropped. creating...") db.create_all() - print("inserting manual scheduling possibility") + print("inserting manual scheduling possibility and fallback trackservice schedule") db.session.add(manualschedule) + db.session.add(fallback_trackservice_schedule) print("all created. commiting...") db.session.commit() print("Database recreated!") @@ -57,13 +61,15 @@ class Model: # ------------------------------------------------------------------------------------------ # -class Schedule(db.Model, Model): +class Schedule(db.Model, AuraDatabaseModel): """ One specific Schedule for a show on a timeslot """ __tablename__ = 'schedule' + + # primary and foreign keys schedule_id = Column(Integer, primary_key=True, autoincrement=False) - show_id = Column(Integer) + show_id = Column(Integer) # well, not needed.. schedule_start = Column(DateTime) # can be null due to manual entries schedule_end = Column(DateTime) # can be null due to manual entries @@ -108,15 +114,17 @@ class Schedule(db.Model, Model): # ------------------------------------------------------------------------------------------ # -class ScheduleEntry(db.Model, Model): +class ScheduleEntry(db.Model, AuraDatabaseModel): """ One schedule can have multiple entries """ __tablename__ = 'schedule_entry' + # primary and foreign keys playlist_id = Column(Integer, primary_key=True, nullable=False, autoincrement=False) entry_num = Column(Integer, primary_key=True, nullable=False, autoincrement=False) schedule_id = Column(Integer, ForeignKey("schedule.schedule_id")) + entry_start = Column(DateTime, nullable=False) entry_end = Column(DateTime) source = Column(String(256)) @@ -132,6 +140,7 @@ class ScheduleEntry(db.Model, Model): entry_end_unix = 0 programme_index = -1 + ForeignKeyConstraint(['schedule_id'], ['schedule.schedule_id']) schedule = relationship("Schedule", foreign_keys=[schedule_id]) # ------------------------------------------------------------------------------------------ # @@ -208,67 +217,45 @@ class ScheduleEntry(db.Model, Model): return "ScheduleEntry starts @ " + ScheduleEntry.entry_start + " and ends @ " + ScheduleEntry.entry_end + " and plays " + ScheduleEntry.source -# def __init__(self, playlist_id, entry_num, schedule_id, entry_start, entry_end, source, artist, track, albumname, genre, tracknum, cdnum, year): -# self.playlist_id = playlist_id -# self.entry_num = entry_num -# self.schedule_id = schedule_id -# self.entry_start = entry_start -# self.entry_end = entry_end -# self.source = source -# self.artist = artist -# self.track = track -# self.albumname = albumname -# self.genre = genre -# self.tracknum = tracknum -# self.cdnum = cdnum -# self.year = year - - @staticmethod - def create_from_json(playlist_id, entry_num, schedule_id, entry_start, entry_end, source, artist, track, albumname, genre, tracknum, cdnum, year): - e = ScheduleEntry() - e.playlist_id = playlist_id - e.entry_num = entry_num - e.schedule_id = schedule_id - e.entry_start = entry_start - e.entry_end = entry_end - e.source = source - e.artist = artist - e.track = track - e.albumname = albumname - e.genre = genre - e.tracknum = tracknum - e.cdnum = cdnum - e.year = year - return e - -# @property -# def serialize(self): -# """Return object data in easily serializeable format""" -# return { -# 'schedule_id': self.schedule_id, -# 'entry_start': self.dump_datetime(self.entry_start), -# 'entry_end': self.dump_datetime(self.entry_end), -# 'source': self.source -# } - - # ------------------------------------------------------------------------------------------ # -class TrackServiceSchedule(db.Model): +class TrackServiceSchedule(db.Model, AuraDatabaseModel): """ Trackservice is tracking every schedule. """ __tablename__ = 'trackservice_schedule' + + # primary and foreign keys ts_schedule_id = Column(Integer, primary_key=True, autoincrement=True) - schedule_id = Column(Integer, ForeignKey('schedule.schedule_id')) + schedule_id = Column(Integer, ForeignKey("schedule.schedule_id")) + + # ------------------------------------------------------------------------------------------ # + @staticmethod + def select_one(schedule_id): + # damn BAND-AID + db.session.commit() + + return db.session.query(ScheduleEntry).filter(TrackServiceSchedule.schedule_id == schedule_id).first() # ------------------------------------------------------------------------------------------ # -class TrackServiceScheduleEntry(db.Model): +class TrackServiceScheduleEntry(db.Model, AuraDatabaseModel): """ And a schedule can have multiple entries """ __tablename__ = 'trackservice_entry' + + # primary and foreign keys. the foreign keys here can be null, because of fallback stuff ts_entry_id = Column(Integer, primary_key=True, autoincrement=True) - ts_schedule_id = Column(Integer, ForeignKey('trackservice_schedule.ts_schedule_id')) + ts_schedule_id = Column(Integer, ForeignKey("trackservice_schedule.ts_schedule_id"), nullable=True) + playlist_id = Column(Integer, nullable=True) + entry_num = Column(Integer, nullable=True) + + fallback = Column(Boolean, default=False) + fallback_start = Column(DateTime, nullable=True, default=None) + source = Column(String(256), nullable=True, default=None) + + # foreign key definitions + ForeignKeyConstraint(['playlist_id', 'entry_num'], ['schedule_entry.playlist_id', 'schedule_entry.entry_num']) + -#Model.recreate_db(True) +#AuraDatabaseModel.recreate_db(True) diff --git a/modules/communication/liquidsoap/communicator.py b/modules/communication/liquidsoap/communicator.py index 0020c11f4ef14d5ffc3d12f459d3e316d8bd0101..cc7810cf0c4ad8ee4337d185dbc597d73d5f04a2 100644 --- a/modules/communication/liquidsoap/communicator.py +++ b/modules/communication/liquidsoap/communicator.py @@ -12,6 +12,7 @@ from modules.communication.liquidsoap.recorderclient import LiquidSoapRecorderCl from modules.communication.liquidsoap.initthread import LiquidSoapInitThread from libraries.enum.consolecolor import TerminalColors from libraries.exceptions.auraexceptions import LQConnectionError +from libraries.database.broadcasts import TrackServiceSchedule, TrackServiceScheduleEntry class LiquidSoapCommunicator: @@ -109,7 +110,7 @@ class LiquidSoapCommunicator: # ------------------------------------------------------------------------------------------ # def activate(self, entry, input_type): if self.scheduler.get_active_source() == input_type: - self.scheduler.insert_track_service_entry(entry) + self.insert_track_service_entry(entry) print(TerminalColors.OK_PINK.value + "LiquidSoapCommunicator " + input_type + " already active! Time: " + str(datetime.datetime.now()) + TerminalColors.ENDC.value) else: print(TerminalColors.OK_PINK.value + "LiquidSoapCommunicator is activating " + input_type + "! Time: " + str(datetime.datetime.now()) + TerminalColors.ENDC.value) @@ -120,7 +121,24 @@ class LiquidSoapCommunicator: self.channel_volume(o, 0) self.channel_volume(input_type, entry.volume) self.disable_transaction(True) - self.scheduler.insert_track_service_entry(entry) + self.insert_track_service_entry(entry) + + # ------------------------------------------------------------------------------------------ # + def insert_track_service_entry(self, schedule_entry): + ts_schedule = TrackServiceSchedule.select_one(schedule_entry.schedule.schedule_id) + + if not ts_schedule: + if self.debug: + print("no TrackServiceSchedule with id " + str(schedule_entry.schedule.schedule_id) + " in database => creating a new one") + ts_schedule = TrackServiceSchedule() + ts_schedule.schedule_id = schedule_entry.schedule.schedule_id + ts_schedule.store(True) + + ts_schedule_entry = TrackServiceScheduleEntry() + ts_schedule_entry.ts_schedule_id = schedule_entry.schedule.schedule_id + ts_schedule_entry.playlist_id = schedule_entry.playlist_id + ts_schedule_entry.entry_num = schedule_entry.entry_num + ts_schedule_entry.store(True) # ------------------------------------------------------------------------------------------ # def all_inputs_but(self, input_type): diff --git a/modules/controller/controller.py b/modules/controller/controller.py index 1485e1d496fb6961b197e4f521a50f5d24526cdb..df5af31bce2ad88442925cd3aa716c23ce7908d5 100644 --- a/modules/controller/controller.py +++ b/modules/controller/controller.py @@ -340,8 +340,6 @@ class AuraController: if not self.is_intern: self.message(simplejson.dumps(self.job_result)) - - # ------------------------------------------------------------------------------------------ # def __check_result__(self, result): """ diff --git a/modules/scheduling/scheduler.py b/modules/scheduling/scheduler.py index 6ae18213a3ea16e64d2130489ab08aecaf187451..dcefd70bea23cae26e792495f20b0becc90d455c 100644 --- a/modules/scheduling/scheduler.py +++ b/modules/scheduling/scheduler.py @@ -52,7 +52,7 @@ import threading from libraries.base.schedulerconfig import AuraSchedulerConfig from modules.communication.redis.messenger import RedisMessenger from libraries.base.calendar import AuraCalendarService -from libraries.database.broadcasts import Schedule, ScheduleEntry, Model, TrackServiceSchedule, TrackServiceScheduleEntry +from libraries.database.broadcasts import Schedule, ScheduleEntry, AuraDatabaseModel from libraries.exceptions.auraexceptions import NoProgrammeLoadedException @@ -142,7 +142,7 @@ class AuraScheduler(): ScheduleEntry.select_all() except sqlalchemy.exc.ProgrammingError as e: if e.__dict__["code"] == "f405": - Model.recreate_db() + AuraDatabaseModel.recreate_db() else: raise @@ -238,7 +238,7 @@ class AuraScheduler(): # when do we have to start? diff = entry.entry_start_unix - now_unix -# diff = diff/100 # testing purpose + diff = diff/100 # testing purpose # create the activation threads and run them after <diff> seconds if entry.source.startswith("linein"): @@ -334,6 +334,8 @@ class AuraScheduler(): return message_queue + # ------------------------------------------------------------------------------------------ # + # ------------------------------------------------------------------------------------------ # def swap_playlist_entries(self, indexes): from_entry = None