Implemented user settings page.

This commit is contained in:
Tiberiu Chibici 2018-10-26 18:41:52 +03:00
parent ab47484f54
commit 58baf16802
10 changed files with 529 additions and 383 deletions

View File

@ -2,19 +2,17 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="245751b6-c863-4572-8723-8499964fe105" name="Default Changelist" comment=""> <list default="true" id="245751b6-c863-4572-8723-8499964fe105" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/__init__.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/server_settings.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/common.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/settings.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/YtManagerApp/views/settings.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManager/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManager/settings.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/models.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/management/videos.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/management/videos.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.css.map" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/urls.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" beforeDir="false" afterPath="$PROJECT_DIR$/YtManagerApp/utils/youtube.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/YtManagerApp/views/old_views.py" beforeDir="false" />
</list> </list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
@ -83,26 +81,26 @@
<entry key="css" value="40" /> <entry key="css" value="40" />
<entry key="default" value="206" /> <entry key="default" value="206" />
<entry key="dummy" value="60" /> <entry key="dummy" value="60" />
<entry key="html" value="8218" /> <entry key="html" value="8458" />
<entry key="ini" value="2545" /> <entry key="ini" value="2545" />
<entry key="js" value="10149" /> <entry key="js" value="10149" />
<entry key="less" value="38" /> <entry key="less" value="38" />
<entry key="py" value="56123" /> <entry key="py" value="58529" />
<entry key="py@youtube-channel-manager" value="265" /> <entry key="py@youtube-channel-manager" value="265" />
<entry key="scss" value="1647" /> <entry key="scss" value="1700" />
</counts> </counts>
</usages-collector> </usages-collector>
<usages-collector id="statistics.file.types.edit"> <usages-collector id="statistics.file.types.edit">
<counts> <counts>
<entry key="CSS" value="40" /> <entry key="CSS" value="40" />
<entry key="CommandLine" value="148" /> <entry key="CommandLine" value="148" />
<entry key="HTML" value="8218" /> <entry key="HTML" value="8458" />
<entry key="Ini" value="2545" /> <entry key="Ini" value="2545" />
<entry key="JavaScript" value="10149" /> <entry key="JavaScript" value="10149" />
<entry key="Less" value="38" /> <entry key="Less" value="38" />
<entry key="PLAIN_TEXT" value="383" /> <entry key="PLAIN_TEXT" value="383" />
<entry key="Python" value="56524" /> <entry key="Python" value="58930" />
<entry key="SCSS" value="1647" /> <entry key="SCSS" value="1700" />
<entry key="Scratch" value="42" /> <entry key="Scratch" value="42" />
</counts> </counts>
</usages-collector> </usages-collector>
@ -112,13 +110,13 @@
<entry key="css" value="4" /> <entry key="css" value="4" />
<entry key="default" value="2" /> <entry key="default" value="2" />
<entry key="gif" value="1" /> <entry key="gif" value="1" />
<entry key="html" value="105" /> <entry key="html" value="110" />
<entry key="ini" value="10" /> <entry key="ini" value="12" />
<entry key="js" value="28" /> <entry key="js" value="28" />
<entry key="less" value="1" /> <entry key="less" value="1" />
<entry key="py" value="313" /> <entry key="py" value="336" />
<entry key="rnc" value="1" /> <entry key="rnc" value="1" />
<entry key="scss" value="29" /> <entry key="scss" value="30" />
<entry key="ytmanagerapp_channel" value="3" /> <entry key="ytmanagerapp_channel" value="3" />
<entry key="ytmanagerapp_subscription" value="8" /> <entry key="ytmanagerapp_subscription" value="8" />
<entry key="ytmanagerapp_subscriptionfolder" value="4" /> <entry key="ytmanagerapp_subscriptionfolder" value="4" />
@ -129,75 +127,175 @@
<counts> <counts>
<entry key="CSS" value="4" /> <entry key="CSS" value="4" />
<entry key="Database Element" value="36" /> <entry key="Database Element" value="36" />
<entry key="HTML" value="105" /> <entry key="HTML" value="110" />
<entry key="Image" value="1" /> <entry key="Image" value="1" />
<entry key="Ini" value="10" /> <entry key="Ini" value="12" />
<entry key="JavaScript" value="28" /> <entry key="JavaScript" value="28" />
<entry key="Less" value="1" /> <entry key="Less" value="1" />
<entry key="PLAIN_TEXT" value="2" /> <entry key="PLAIN_TEXT" value="2" />
<entry key="Python" value="313" /> <entry key="Python" value="336" />
<entry key="RNG Compact" value="1" /> <entry key="RNG Compact" value="1" />
<entry key="SCSS" value="29" /> <entry key="SCSS" value="30" />
</counts> </counts>
</usages-collector> </usages-collector>
</session> </session>
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <splitter split-orientation="horizontal" split-proportion="0.5446375">
<file pinned="false" current-in-tab="false"> <split-first>
<entry file="file://C:/Python36/Lib/site-packages/django/template/base.py"> <leaf>
<provider selected="true" editor-type-id="text-editor"> <file pinned="false" current-in-tab="false">
<state relative-caret-position="279"> <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/settings.html">
<caret line="759" column="23" selection-start-line="759" selection-start-column="23" selection-end-line="759" selection-end-column="23" /> <provider selected="true" editor-type-id="text-editor">
</state> <state relative-caret-position="187">
</provider> <caret line="11" column="19" lean-forward="true" selection-start-line="11" selection-start-column="19" selection-end-line="11" selection-end-column="19" />
</entry> </state>
</file> </provider>
<file pinned="false" current-in-tab="false"> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss"> </file>
<provider selected="true" editor-type-id="text-editor"> <file pinned="false" current-in-tab="true">
<state relative-caret-position="527"> <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/server_settings.html">
<caret line="145" column="1" lean-forward="true" selection-start-line="145" selection-start-column="1" selection-end-line="145" selection-end-column="1" /> <provider selected="true" editor-type-id="text-editor">
</state> <state relative-caret-position="119">
</provider> <caret line="7" column="70" lean-forward="true" selection-start-line="7" selection-start-column="8" selection-end-line="7" selection-end-column="70" />
</entry> </state>
</file> </provider>
<file pinned="false" current-in-tab="true"> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html"> </file>
<provider selected="true" editor-type-id="text-editor"> <file pinned="false" current-in-tab="false">
<state relative-caret-position="391"> <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss">
<caret line="23" column="56" selection-start-line="23" selection-start-column="56" selection-end-line="23" selection-end-column="56" /> <provider selected="true" editor-type-id="text-editor">
</state> <state relative-caret-position="391">
</provider> <caret line="23" lean-forward="true" selection-start-line="23" selection-end-line="23" />
</entry> </state>
</file> </provider>
<file pinned="false" current-in-tab="false"> </entry>
<entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video"> </file>
<provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider"> <file pinned="false" current-in-tab="false">
<state> <entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
<filtering enabled="true" /> <provider selected="true" editor-type-id="text-editor">
</state> <state relative-caret-position="210">
</provider> <caret line="107" column="29" selection-start-line="107" selection-start-column="29" selection-end-line="107" selection-end-column="29" />
</entry> <folding>
</file> <element signature="e#0#14#0" expanded="true" />
</leaf> <marker date="1540567441574" expanded="true" signature="7364:7507" ph="..." />
<marker date="1540567441574" expanded="true" signature="9904:10347" ph="..." />
<marker date="1540567441574" expanded="true" signature="12893:12902" ph="..." />
<marker date="1540567441574" expanded="true" signature="12893:13221" ph="..." />
<marker date="1540567441574" expanded="true" signature="13271:13799" ph="..." />
<marker date="1540567441574" expanded="true" signature="13771:13799" ph="..." />
<marker date="1540567441574" expanded="true" signature="15418:16530" ph="..." />
<marker date="1540567441574" expanded="true" signature="16353:16530" ph="..." />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="40" lean-forward="true" selection-start-line="40" selection-end-line="40" />
<folding>
<element signature="e#0#42#0" expanded="true" />
<marker date="1540568238284" expanded="true" signature="286:1323" ph="..." />
<marker date="1540568238284" expanded="true" signature="1354:1359" ph="..." />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</split-first>
<split-second>
<leaf>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/index.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
<folding>
<element signature="e#0#42#0" expanded="true" />
<marker date="1540023237405" expanded="true" signature="3128:3307" ph="..." />
<marker date="1540023237405" expanded="true" signature="3339:3340" ph="..." />
<marker date="1540023237405" expanded="true" signature="3646:3647" ph="..." />
<marker date="1540023237405" expanded="true" signature="3646:4387" ph="..." />
<marker date="1540023237405" expanded="true" signature="3668:4279" ph="..." />
<marker date="1540023237405" expanded="true" signature="4432:4436" ph="..." />
<marker date="1540023237405" expanded="true" signature="5221:6592" ph="..." />
<marker date="1540023237405" expanded="true" signature="5465:5470" ph="..." />
<marker date="1540023237405" expanded="true" signature="5491:5566" ph="..." />
<marker date="1540023237405" expanded="true" signature="6640:6641" ph="..." />
<marker date="1540023237405" expanded="true" signature="7201:7204" ph="..." />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="428">
<caret line="68" column="31" selection-start-line="68" selection-start-column="31" selection-end-line="68" selection-end-column="31" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/edit.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="196" column="28" selection-start-line="196" selection-start-column="28" selection-end-line="196" selection-end-column="28" />
<folding>
<element signature="e#559#654#0" />
<element signature="e#690#758#0" />
<element signature="e#798#864#0" />
<element signature="e#1147#1527#0" />
<element signature="e#1227#1322#0" />
<element signature="e#1387#1505#0" />
<element signature="e#1401#1504#0" />
<element signature="e#1568#1819#0" />
<element signature="e#2022#2149#0" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="51">
<caret line="7" column="6" selection-start-line="7" selection-start-column="6" selection-end-line="7" selection-end-column="6" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/config/config.ini">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="476">
<caret line="55" column="56" selection-start-line="55" selection-start-column="56" selection-end-line="55" selection-end-column="56" />
</state>
</provider>
</entry>
</file>
</leaf>
</split-second>
</splitter>
</component> </component>
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="SCSS File" /> <option value="SCSS File" />
<option value="Setup Script" /> <option value="Setup Script" />
<option value="HTML File" />
<option value="JavaScript File" /> <option value="JavaScript File" />
<option value="Python Script" /> <option value="Python Script" />
<option value="HTML File" />
</list> </list>
</option> </option>
</component> </component>
<component name="FindInProjectRecents"> <component name="FindInProjectRecents">
<findStrings> <findStrings>
<find>folderEditDialog_</find>
<find>treeNode_Edit</find>
<find>default_app_config</find>
<find>start_synchronization_timer</find> <find>start_synchronization_timer</find>
<find>thumbnailUrl</find> <find>thumbnailUrl</find>
<find>__fetch_thumbnail</find> <find>__fetch_thumbnail</find>
@ -225,6 +323,9 @@
<find>self.helper</find> <find>self.helper</find>
<find>_interpolation</find> <find>_interpolation</find>
<find>csrf</find> <find>csrf</find>
<find>pre&gt;</find>
<find>UpdateView</find>
<find>success_url</find>
</findStrings> </findStrings>
<replaceStrings> <replaceStrings>
<replace>loading</replace> <replace>loading</replace>
@ -239,6 +340,7 @@
<replace>videos-loading</replace> <replace>videos-loading</replace>
<replace>ajax_get_videos</replace> <replace>ajax_get_videos</replace>
<replace>ajax_get_tree</replace> <replace>ajax_get_tree</replace>
<replace>code&gt;</replace>
</replaceStrings> </replaceStrings>
</component> </component>
<component name="Git.Settings"> <component name="Git.Settings">
@ -247,9 +349,6 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_unauthenticated.html" />
<option value="$PROJECT_DIR$/YtManagerApp/views/auth.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/dialog.html" />
<option value="$PROJECT_DIR$/YtManagerApp/views/dialog.py" /> <option value="$PROJECT_DIR$/YtManagerApp/views/dialog.py" />
<option value="$PROJECT_DIR$/YtManagerApp/views/modal.py" /> <option value="$PROJECT_DIR$/YtManagerApp/views/modal.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/common.js" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/common.js" />
@ -276,19 +375,16 @@
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/subscription_tree.js" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/subscription_tree.js" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/videos.js" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/videos.js" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index.html" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index.html" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" />
<option value="$PROJECT_DIR$/YtManagerApp/apps.py" /> <option value="$PROJECT_DIR$/YtManagerApp/apps.py" />
<option value="$PROJECT_DIR$/YtManagerApp/utils/customconfigparser.py" /> <option value="$PROJECT_DIR$/YtManagerApp/utils/customconfigparser.py" />
<option value="$PROJECT_DIR$/YtManagerApp/views/index.py" /> <option value="$PROJECT_DIR$/YtManagerApp/views/index.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/index.js" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/index.js" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js" />
<option value="$PROJECT_DIR$/YtManagerApp/management/jobs/download_video.py" /> <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/download_video.py" />
<option value="$PROJECT_DIR$/YtManagerApp/urls.py" />
<option value="$PROJECT_DIR$/YtManagerApp/management/downloader.py" /> <option value="$PROJECT_DIR$/YtManagerApp/management/downloader.py" />
<option value="$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py" /> <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py" />
<option value="$PROJECT_DIR$/YtManagerApp/views/actions.py" /> <option value="$PROJECT_DIR$/YtManagerApp/views/actions.py" />
<option value="$PROJECT_DIR$/YtManagerApp/scheduler.py" /> <option value="$PROJECT_DIR$/YtManagerApp/scheduler.py" />
<option value="$PROJECT_DIR$/YtManagerApp/models.py" />
<option value="$PROJECT_DIR$/YtManagerApp/management/videos.py" /> <option value="$PROJECT_DIR$/YtManagerApp/management/videos.py" />
<option value="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" /> <option value="$PROJECT_DIR$/YtManagerApp/management/jobs/synchronize.py" />
<option value="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" /> <option value="$PROJECT_DIR$/YtManagerApp/utils/iterutils.py" />
@ -296,8 +392,14 @@
<option value="$PROJECT_DIR$/YtManager/settings.py" /> <option value="$PROJECT_DIR$/YtManager/settings.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templatetags/common.py" /> <option value="$PROJECT_DIR$/YtManagerApp/templatetags/common.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py" /> <option value="$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py" />
<option value="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" /> <option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html" />
<option value="$PROJECT_DIR$/YtManagerApp/urls.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/settings.html" />
<option value="$PROJECT_DIR$/YtManagerApp/models.py" />
<option value="$PROJECT_DIR$/YtManagerApp/views/settings.py" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html" />
<option value="$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss" />
<option value="$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/server_settings.html" />
</list> </list>
</option> </option>
</component> </component>
@ -313,10 +415,10 @@
</packageJsonPaths> </packageJsonPaths>
</component> </component>
<component name="ProjectFrameBounds" extendedState="6"> <component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="72" /> <option name="x" value="-8" />
<option name="y" value="-8" /> <option name="y" value="-8" />
<option name="width" value="1928" /> <option name="width" value="643" />
<option name="height" value="963" /> <option name="height" value="321" />
</component> </component>
<component name="ProjectInspectionProfilesVisibleTreeState"> <component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default"> <entry key="Project Default">
@ -418,7 +520,14 @@
<item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" /> <item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
<item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" /> <item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
<item name="YtManagerApp" type="462c0819:PsiDirectoryNode" /> <item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
<item name="templatetags" type="462c0819:PsiDirectoryNode" /> <item name="templates" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="youtube-channel-manager" type="b2602c69:ProjectViewProjectNode" />
<item name="youtube-channel-manager" type="462c0819:PsiDirectoryNode" />
<item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
<item name="YtManagerApp" type="462c0819:PsiDirectoryNode" />
</path> </path>
</expand> </expand>
<select /> <select />
@ -440,6 +549,7 @@
</component> </component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="D:\Dev\youtube-channel-manager\YtManagerApp\templates\YtManagerApp" />
<recent name="D:\Dev\youtube-channel-manager\YtManagerApp\management\jobs" /> <recent name="D:\Dev\youtube-channel-manager\YtManagerApp\management\jobs" />
<recent name="D:\Dev\youtube-channel-manager\YtManagerApp\templates\YtManagerApp\controls" /> <recent name="D:\Dev\youtube-channel-manager\YtManagerApp\templates\YtManagerApp\controls" />
<recent name="D:\Dev\youtube-channel-manager\YtManagerApp\templates\registration" /> <recent name="D:\Dev\youtube-channel-manager\YtManagerApp\templates\registration" />
@ -596,7 +706,7 @@
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" /> <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<editor active="true" /> <editor active="true" />
<layout> <layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.20469083" /> <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.14712153" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" /> <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" /> <window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" /> <window_info anchor="bottom" id="Message" order="0" />
@ -618,7 +728,7 @@
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" /> <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" /> <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="SciView" order="3" weight="0.32995737" /> <window_info anchor="right" id="SciView" order="3" weight="0.32995737" />
<window_info anchor="right" id="Database" order="4" visible="true" weight="0.13006397" /> <window_info anchor="right" id="Database" order="4" weight="0.26813188" />
</layout> </layout>
<layout-to-restore> <layout-to-restore>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.15138593" /> <window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.15138593" />
@ -653,51 +763,6 @@
<option name="myLimit" value="2678400000" /> <option name="myLimit" value="2678400000" />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_subscription">
<provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
<state>
<filtering enabled="true" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_update_modal.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="4" selection-start-line="14" selection-start-column="4" selection-end-line="14" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_update_modal.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="69" selection-start-line="8" selection-start-column="69" selection-end-line="8" selection-end-column="69" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/folder_delete_modal.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="18" selection-start-line="18" selection-end-line="18" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/subscription_delete_modal.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="13" selection-start-line="13" selection-end-line="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/controls/modal.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="19" column="51" selection-start-line="19" selection-start-column="51" selection-end-line="19" selection-end-column="51" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/videos.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/login.scss"> <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/login.scss">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor" />
</entry> </entry>
@ -712,33 +777,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="102" column="42" lean-forward="true" selection-start-line="102" selection-start-column="42" selection-end-line="102" selection-end-column="42" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/edit.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3213">
<caret line="227" column="46" lean-forward="true" selection-start-line="227" selection-start-column="46" selection-end-line="227" selection-end-column="46" />
<folding>
<element signature="e#559#654#0" />
<element signature="e#690#758#0" />
<element signature="e#798#864#0" />
<element signature="e#915#1106#0" />
<element signature="e#1147#1527#0" />
<element signature="e#1227#1322#0" />
<element signature="e#1387#1505#0" />
<element signature="e#1401#1504#0" />
<element signature="e#1568#1819#0" />
<element signature="e#2022#2149#0" />
<element signature="e#2201#2373#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/management/subscriptions.py"> <entry file="file://$PROJECT_DIR$/YtManagerApp/management/subscriptions.py">
<provider selected="true" editor-type-id="text-editor" /> <provider selected="true" editor-type-id="text-editor" />
</entry> </entry>
@ -789,13 +827,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="446">
<caret line="71" column="79" lean-forward="true" selection-start-line="71" selection-start-column="16" selection-end-line="71" selection-end-column="79" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/crispy_forms/layout.py"> <entry file="file://C:/Python36/Lib/site-packages/crispy_forms/layout.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="193"> <state relative-caret-position="193">
@ -820,23 +851,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/old_views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="205">
<caret line="84" selection-start-line="84" selection-end-line="84" />
<folding>
<element signature="e#0#35#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="296">
<caret line="59" column="28" selection-start-line="59" selection-start-column="28" selection-end-line="59" selection-end-column="28" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js"> <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/js/common.js">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="396"> <state relative-caret-position="396">
@ -865,13 +879,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="87" selection-start-line="87" selection-end-line="87" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/mimetypes.py"> <entry file="file://C:/Python36/Lib/mimetypes.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="4879"> <state relative-caret-position="4879">
@ -912,16 +919,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="38" column="63" selection-start-line="38" selection-start-column="63" selection-end-line="38" selection-end-column="63" />
<folding>
<element signature="e#643#675#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/utils/iterutils.py"> <entry file="file://$PROJECT_DIR$/YtManagerApp/utils/iterutils.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="544"> <state relative-caret-position="544">
@ -981,27 +978,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/config/config.ini">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="293" column="12" selection-start-line="293" selection-start-column="12" selection-end-line="293" selection-end-column="12" />
<folding>
<element signature="e#0#14#0" expanded="true" />
<marker date="1540074893218" expanded="true" signature="4003:4146" ph="..." />
<marker date="1540074893218" expanded="true" signature="6543:6986" ph="..." />
<marker date="1540074893218" expanded="true" signature="9532:9541" ph="..." />
<marker date="1540074893218" expanded="true" signature="9532:9860" ph="..." />
<marker date="1540074893218" expanded="true" signature="9910:10438" ph="..." />
<marker date="1540074893218" expanded="true" signature="10410:10438" ph="..." />
<marker date="1540074893218" expanded="true" signature="12057:13169" ph="..." />
<marker date="1540074893218" expanded="true" signature="12992:13169" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py"> <entry file="file://$PROJECT_DIR$/YtManagerApp/management/jobs/delete_video.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68"> <state relative-caret-position="68">
@ -1016,10 +992,172 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/common.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459">
<caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="30" column="9" lean-forward="true" selection-start-line="30" selection-start-column="9" selection-end-line="30" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/old_views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1428">
<caret line="84" selection-start-line="84" selection-end-line="84" />
<folding>
<element signature="e#0#35#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
<provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
<state>
<filtering enabled="true" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/auth.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" column="44" selection-start-line="11" selection-start-column="44" selection-end-line="11" selection-end-column="44" />
<folding>
<element signature="e#0#42#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index.html">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret selection-end-column="48" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/template/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="91">
<caret line="101" column="11" lean-forward="true" selection-start-line="101" selection-start-column="11" selection-end-line="101" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="357">
<caret line="54" selection-start-line="54" selection-end-line="54" />
<folding>
<element signature="e#643#675#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="143">
<caret line="23" column="56" selection-start-line="23" selection-start-column="56" selection-end-line="23" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/core/handlers/exception.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="194">
<caret line="33" selection-start-line="33" selection-end-line="33" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="67" selection-start-line="67" selection-end-line="67" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/edit.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="196" column="28" selection-start-line="196" selection-start-column="28" selection-end-line="196" selection-end-column="28" />
<folding>
<element signature="e#559#654#0" />
<element signature="e#690#758#0" />
<element signature="e#798#864#0" />
<element signature="e#1147#1527#0" />
<element signature="e#1227#1322#0" />
<element signature="e#1387#1505#0" />
<element signature="e#1401#1504#0" />
<element signature="e#1568#1819#0" />
<element signature="e#2022#2149#0" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="51">
<caret line="7" column="6" selection-start-line="7" selection-start-column="6" selection-end-line="7" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/db/models/query.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="194">
<caret line="474" column="8" selection-start-line="474" selection-start-column="8" selection-end-line="474" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/db/models/fields/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-425">
<caret line="89" column="6" selection-start-line="89" selection-start-column="6" selection-end-line="89" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config/config.ini">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="476">
<caret line="55" column="56" selection-start-line="55" selection-start-column="56" selection-end-line="55" selection-end-column="56" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="40" lean-forward="true" selection-start-line="40" selection-end-line="40" />
<folding>
<element signature="e#0#42#0" expanded="true" />
<marker date="1540568238284" expanded="true" signature="286:1323" ph="..." />
<marker date="1540568238284" expanded="true" signature="1354:1359" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="210">
<caret line="107" column="29" selection-start-line="107" selection-start-column="29" selection-end-line="107" selection-end-column="29" />
<folding>
<element signature="e#0#14#0" expanded="true" />
<marker date="1540567441574" expanded="true" signature="7364:7507" ph="..." />
<marker date="1540567441574" expanded="true" signature="9904:10347" ph="..." />
<marker date="1540567441574" expanded="true" signature="12893:12902" ph="..." />
<marker date="1540567441574" expanded="true" signature="12893:13221" ph="..." />
<marker date="1540567441574" expanded="true" signature="13271:13799" ph="..." />
<marker date="1540567441574" expanded="true" signature="13771:13799" ph="..." />
<marker date="1540567441574" expanded="true" signature="15418:16530" ph="..." />
<marker date="1540567441574" expanded="true" signature="16353:16530" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/views/index.py"> <entry file="file://$PROJECT_DIR$/YtManagerApp/views/index.py">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="420"> <state relative-caret-position="221">
<caret line="159" column="32" lean-forward="true" selection-start-line="159" selection-start-column="32" selection-end-line="159" selection-end-column="32" /> <caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
<folding> <folding>
<element signature="e#0#42#0" expanded="true" /> <element signature="e#0#42#0" expanded="true" />
<marker date="1540023237405" expanded="true" signature="3128:3307" ph="..." /> <marker date="1540023237405" expanded="true" signature="3128:3307" ph="..." />
@ -1037,45 +1175,31 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/common.py"> <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/master_default.html">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459"> <state relative-caret-position="428">
<caret line="30" lean-forward="true" selection-start-line="30" selection-end-line="30" /> <caret line="68" column="31" selection-start-line="68" selection-start-column="31" selection-end-line="68" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="das://2dac2136-d902-4d27-8789-9371934602fd/schema/main/table/ytmanagerapp_video">
<provider selected="true" editor-type-id="com.intellij.database.editor.DatabaseTableFileEditorProvider">
<state>
<filtering enabled="true" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templatetags/ratings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="30" column="9" lean-forward="true" selection-start-line="30" selection-start-column="9" selection-end-line="30" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://C:/Python36/Lib/site-packages/django/template/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="279">
<caret line="759" column="23" selection-start-line="759" selection-start-column="23" selection-end-line="759" selection-end-column="23" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss"> <entry file="file://$PROJECT_DIR$/YtManagerApp/static/YtManagerApp/css/style.scss">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="527"> <state relative-caret-position="391">
<caret line="145" column="1" lean-forward="true" selection-start-line="145" selection-start-column="1" selection-end-line="145" selection-end-column="1" /> <caret line="23" lean-forward="true" selection-start-line="23" selection-end-line="23" />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/index_videos.html"> <entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/settings.html">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="391"> <state relative-caret-position="187">
<caret line="23" column="56" selection-start-line="23" selection-start-column="56" selection-end-line="23" selection-end-column="56" /> <caret line="11" column="19" lean-forward="true" selection-start-line="11" selection-start-column="19" selection-end-line="11" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/YtManagerApp/templates/YtManagerApp/server_settings.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="7" column="70" lean-forward="true" selection-start-line="7" selection-start-column="8" selection-end-line="7" selection-end-column="70" />
</state> </state>
</provider> </provider>
</entry> </entry>

View File

@ -8,8 +8,6 @@ from django.db import models
from django.db.models.functions import Lower from django.db.models.functions import Lower
from YtManagerApp.utils.youtube import YoutubeAPI, YoutubeChannelInfo, YoutubePlaylistInfo from YtManagerApp.utils.youtube import YoutubeAPI, YoutubeChannelInfo, YoutubePlaylistInfo
# help_text = user shown text # help_text = user shown text
# verbose_name = user shown name # verbose_name = user shown name
# null = nullable, blank = user is allowed to set value to empty # null = nullable, blank = user is allowed to set value to empty
@ -17,20 +15,87 @@ from YtManagerApp.utils.youtube import YoutubeAPI, YoutubeChannelInfo, YoutubePl
class UserSettings(models.Model): class UserSettings(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
mark_deleted_as_watched = models.BooleanField(null=True)
delete_watched = models.BooleanField(null=True) mark_deleted_as_watched = models.BooleanField(
auto_download = models.BooleanField(null=True) null=True, blank=True,
download_global_limit = models.IntegerField(null=True) help_text='When a downloaded video is deleted from the system, it will be marked as \'watched\'.')
download_subscription_limit = models.IntegerField(null=True)
download_order = models.TextField(null=True) delete_watched = models.BooleanField(
download_path = models.TextField(null=True) null=True, blank=True,
download_file_pattern = models.TextField(null=True) help_text='Videos marked as watched are automatically deleted.')
download_format = models.TextField(null=True)
download_subtitles = models.BooleanField(null=True) auto_download = models.BooleanField(
download_autogenerated_subtitles = models.BooleanField(null=True) null=True, blank=True,
download_subtitles_all = models.BooleanField(null=True) help_text='Enables or disables automatic downloading.')
download_subtitles_langs = models.TextField(null=True)
download_subtitles_format = models.TextField(null=True) download_global_limit = models.IntegerField(
null=True, blank=True,
help_text='Limits the total number of videos downloaded (-1 = no limit).')
download_subscription_limit = models.IntegerField(
null=True, blank=True,
help_text='Limits the number of videos downloaded per subscription (-1 = no limit). '
' This setting can be overriden for each individual subscription in the subscription edit dialog.')
download_order = models.CharField(
null=True, blank=True,
max_length=100,
help_text='The order in which videos will be downloaded.'
)
download_path = models.CharField(
null=True, blank=True,
max_length=1024,
help_text='Path on the disk where downloaded videos are stored. '
' You can use environment variables using syntax: <code>${env:...}</code>'
)
download_file_pattern = models.CharField(
null=True, blank=True,
max_length=1024,
help_text='A pattern which describes how downloaded files are organized. Extensions are automatically appended.'
' You can use the following fields, using the <code>${field}</code> syntax:'
' channel, channel_id, playlist, playlist_id, playlist_index, title, id.'
' Example: <code>${channel}/${playlist}/S01E${playlist_index} - ${title} [${id}]</code>')
download_format = models.CharField(
null=True, blank=True,
max_length=256,
help_text='Download format that will be passed to youtube-dl. '
' See the <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#format-selection">'
' youtube-dl documentation</a> for more details.')
download_subtitles = models.BooleanField(
null=True, blank=True,
help_text='Enable downloading subtitles for the videos.'
' The flag is passed directly to youtube-dl. You can find more information'
' <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#subtitle-options">here</a>.')
download_autogenerated_subtitles = models.BooleanField(
null=True, blank=True,
help_text='Enables downloading the automatically generated subtitle.'
' The flag is passed directly to youtube-dl. You can find more information'
' <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#subtitle-options">here</a>.')
download_subtitles_all = models.BooleanField(
null=True, blank=True,
help_text='If enabled, all the subtitles in all the available languages will be downloaded.'
' The flag is passed directly to youtube-dl. You can find more information'
' <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#subtitle-options">here</a>.')
download_subtitles_langs = models.CharField(
null=True, blank=True,
max_length=250,
help_text='Comma separated list of languages for which subtitles will be downloaded.'
' The flag is passed directly to youtube-dl. You can find more information'
' <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#subtitle-options">here</a>.')
download_subtitles_format = models.CharField(
null=True, blank=True,
max_length=100,
help_text='Subtitles format preference. Examples: srt/ass/best'
' The flag is passed directly to youtube-dl. You can find more information'
' <a href="https://github.com/rg3/youtube-dl/blob/master/README.md#subtitle-options">here</a>.')
@staticmethod @staticmethod
def find_by_user(user: User): def find_by_user(user: User):

View File

@ -1,4 +1,7 @@
.footer { #main_body {
margin-bottom: 4rem; }
#main_footer {
position: fixed; position: fixed;
left: 0; left: 0;
right: 0; right: 0;

View File

@ -1,6 +1,6 @@
{ {
"version": 3, "version": 3,
"mappings": "AAEA,OAAQ;EACJ,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,MAAM;EACrB,SAAS,EAAE,IAAI;;AAqBnB,uBAAuB;AACvB,kBAAmB;EAlBf,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,wBAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,iBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AASzD,wBAAyB;EAtBrB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,8BAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,mBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AAazD,4BAOC;EANG,EAAG;IACC,SAAS,EAAE,YAAY;EAE3B,IAAK;IACD,SAAS,EAAE,cAAc;AAIjC,gCAAiC;EAC7B,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,KAAK;EACjB,WAAW,EAAE,KAAK;;AAGtB,cAAe;EACX,QAAQ,EAAE,KAAK;EAAE,oCAAoC;EACrD,OAAO,EAAE,IAAI;EAAE,uBAAuB;EACtC,KAAK,EAAE,IAAI;EAAE,uCAAuC;EACpD,MAAM,EAAE,IAAI;EAAE,wCAAwC;EACtD,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,gBAAgB,EAAE,kBAAe;EAAE,mCAAmC;EACtE,OAAO,EAAE,CAAC;EAAE,qFAAqF;EACjG,MAAM,EAAE,OAAO;EAAE,4BAA4B;;AAI7C,4BAAc;EACV,OAAO,EAAE,MAAM;EACf,aAAa,EAAE,KAAK;AAGpB,+BAAW;EACP,OAAO,EAAE,MAAM;AAEnB,+BAAW;EACP,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;AAExB,gCAAY;EACR,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;EAEpB,uCAAO;IACH,SAAS,EAAE,GAAG;AAGtB,iCAAa;EACT,OAAO,EAAE,YAAY;AAGzB,+BAAW;EACP,YAAY,EAAE,QAAQ;EACtB,qCAAQ;IACJ,eAAe,EAAE,IAAI;AAO7B,8BAAU;EACN,KAAK,EAAE,KAAK;AAKpB,8BAAgB;EACZ,KAAK,EAnHE,OAAO;AAqHlB,6BAAe;EACX,KAAK,EAAE,OAAO;;AAItB,WAAY;EACR,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,MAAM;;AAId,2BAAe;EACX,OAAO,EAAE,IAAI;;AAIrB,kBAAmB;EACf,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ;EAEjB,qBAAG;IACC,MAAM,EAAE,CAAC;;AAIjB,YAAa;EACT,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,MAAM", "mappings": "AAEA,UAAW;EACP,aAAa,EAAE,IAAI;;AAGvB,YAAa;EACT,QAAQ,EAAE,KAAK;EACf,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,IAAI;EACb,aAAa,EAAE,MAAM;EACrB,SAAS,EAAE,IAAI;;AAqBnB,uBAAuB;AACvB,kBAAmB;EAlBf,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,wBAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,iBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AASzD,wBAAyB;EAtBrB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAa;EACpB,MAAM,EAAE,IAAa;EAErB,8BAAQ;IACJ,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,IAAa;IACpB,MAAM,EAAE,IAAa;IACrB,MAAM,EAAE,GAAG;IACX,aAAa,EAAE,GAAG;IAClB,MAAM,EAAE,mBAAkC;IAC1C,YAAY,EAAE,uCAAmD;IACjE,SAAS,EAAE,sCAAsC;;AAazD,4BAOC;EANG,EAAG;IACC,SAAS,EAAE,YAAY;EAE3B,IAAK;IACD,SAAS,EAAE,cAAc;AAIjC,gCAAiC;EAC7B,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,KAAK;EACjB,WAAW,EAAE,KAAK;;AAGtB,cAAe;EACX,QAAQ,EAAE,KAAK;EAAE,oCAAoC;EACrD,OAAO,EAAE,IAAI;EAAE,uBAAuB;EACtC,KAAK,EAAE,IAAI;EAAE,uCAAuC;EACpD,MAAM,EAAE,IAAI;EAAE,wCAAwC;EACtD,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,gBAAgB,EAAE,kBAAe;EAAE,mCAAmC;EACtE,OAAO,EAAE,CAAC;EAAE,qFAAqF;EACjG,MAAM,EAAE,OAAO;EAAE,4BAA4B;;AAI7C,4BAAc;EACV,OAAO,EAAE,MAAM;EACf,aAAa,EAAE,KAAK;AAGpB,+BAAW;EACP,OAAO,EAAE,MAAM;AAEnB,+BAAW;EACP,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;AAExB,gCAAY;EACR,SAAS,EAAE,IAAI;EACf,aAAa,EAAE,KAAK;EAEpB,uCAAO;IACH,SAAS,EAAE,GAAG;AAGtB,iCAAa;EACT,OAAO,EAAE,YAAY;AAGzB,+BAAW;EACP,YAAY,EAAE,QAAQ;EACtB,qCAAQ;IACJ,eAAe,EAAE,IAAI;AAO7B,8BAAU;EACN,KAAK,EAAE,KAAK;AAKpB,8BAAgB;EACZ,KAAK,EAvHE,OAAO;AAyHlB,6BAAe;EACX,KAAK,EAAE,OAAO;;AAItB,WAAY;EACR,SAAS,EAAE,KAAK;EAChB,MAAM,EAAE,MAAM;;AAId,2BAAe;EACX,OAAO,EAAE,IAAI;;AAIrB,kBAAmB;EACf,MAAM,EAAE,QAAQ;EAChB,OAAO,EAAE,QAAQ;EAEjB,qBAAG;IACC,MAAM,EAAE,CAAC;;AAIjB,YAAa;EACT,OAAO,EAAE,YAAY;EACrB,aAAa,EAAE,MAAM",
"sources": ["style.scss"], "sources": ["style.scss"],
"names": [], "names": [],
"file": "style.css" "file": "style.css"

View File

@ -1,6 +1,10 @@
$accent-color: #007bff; $accent-color: #007bff;
.footer { #main_body {
margin-bottom: 4rem;
}
#main_footer {
position: fixed; position: fixed;
left: 0; left: 0;
right: 0; right: 0;

View File

@ -43,7 +43,7 @@
{% endif %} {% endif %}
</a> </a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="userDropdown"> <div class="dropdown-menu dropdown-menu-right" aria-labelledby="userDropdown">
<a class="dropdown-item" href="#">Settings</a> <a class="dropdown-item" href="{% url 'settings' %}">Settings</a>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'logout' %}">Log out</a> <a class="dropdown-item" href="{% url 'logout' %}">Log out</a>
</div> </div>
@ -61,12 +61,12 @@
</nav> </nav>
<div class="container-fluid"> <div id="main_body" class="container-fluid">
{% block body %} {% block body %}
{% endblock %} {% endblock %}
</div> </div>
<footer class="footer bg-light"> <footer id="main_footer" class="footer bg-light">
<span class="ml-auto text-muted">Last synchronized: just now</span> <span class="ml-auto text-muted">Last synchronized: just now</span>
<button id="btn_sync_now" class="btn btn-sm btn-light" title="Synchronize now!"> <button id="btn_sync_now" class="btn btn-sm btn-light" title="Synchronize now!">
<span class="typcn typcn-arrow-sync" aria-hidden="true"></span> <span class="typcn typcn-arrow-sync" aria-hidden="true"></span>

View File

@ -0,0 +1,12 @@
{% extends "YtManagerApp/master_default.html" %}
{% load crispy_forms_tags %}
{% block body %}
<div class="container">
<h1>Settings</h1>
<p>If no value is set, the server's defaults will be used.</p>
{% crispy form %}
</div>
{% endblock body %}

View File

@ -18,12 +18,12 @@ from django.conf.urls import include
from django.conf.urls.static import static from django.conf.urls.static import static
from django.urls import path from django.urls import path
from .views.auth import ExtendedLoginView, RegisterView, RegisterDoneView
from .views.index import index, ajax_get_tree, ajax_get_videos, CreateFolderModal, UpdateFolderModal, DeleteFolderModal,\
CreateSubscriptionModal, UpdateSubscriptionModal, DeleteSubscriptionModal
from .views.actions import SyncNowView, DeleteVideoFilesView, DownloadVideoFilesView, MarkVideoWatchedView, \ from .views.actions import SyncNowView, DeleteVideoFilesView, DownloadVideoFilesView, MarkVideoWatchedView, \
MarkVideoUnwatchedView MarkVideoUnwatchedView
from .views import old_views from .views.auth import ExtendedLoginView, RegisterView, RegisterDoneView
from .views.index import index, ajax_get_tree, ajax_get_videos, CreateFolderModal, UpdateFolderModal, DeleteFolderModal, \
CreateSubscriptionModal, UpdateSubscriptionModal, DeleteSubscriptionModal
from .views.settings import SettingsView
urlpatterns = [ urlpatterns = [
# Authentication URLs # Authentication URLs
@ -53,17 +53,8 @@ urlpatterns = [
path('modal/update_subscription/<int:pk>/', UpdateSubscriptionModal.as_view(), name='modal_update_subscription'), path('modal/update_subscription/<int:pk>/', UpdateSubscriptionModal.as_view(), name='modal_update_subscription'),
path('modal/delete_subscription/<int:pk>/', DeleteSubscriptionModal.as_view(), name='modal_delete_subscription'), path('modal/delete_subscription/<int:pk>/', DeleteSubscriptionModal.as_view(), name='modal_delete_subscription'),
# Index # Pages
path('', index, name='home'), path('', index, name='home'),
path('settings/', SettingsView.as_view(), name='settings'),
# Old stuff
path('ajax/get_children', old_views.ajax_get_children, name='ajax_get_children'),
path('ajax/get_folders', old_views.ajax_get_folders, name='ajax_get_folders'),
path('ajax/edit_folder', old_views.ajax_edit_folder, name='ajax_edit_folder'),
path('ajax/delete_folder/<int:fid>/', old_views.ajax_delete_folder, name='ajax_delete_folder'),
path('ajax/edit_subscription', old_views.ajax_edit_subscription, name='ajax_edit_subscription'),
path('ajax/delete_subscription/<int:sid>/', old_views.ajax_delete_subscription, name='ajax_delete_subscription'),
path('ajax/list_videos', old_views.ajax_list_videos, name='ajax_list_videos'),
# path('', old_views.index, name='home')
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -1,103 +0,0 @@
from django.shortcuts import render
from django.http import HttpResponse, HttpRequest, JsonResponse
from YtManagerApp.models import SubscriptionFolder, Subscription
from YtManagerApp.management.management import FolderManager, SubscriptionManager
def get_children_recurse(parent_id):
children = []
for folder in SubscriptionFolder.objects.filter(parent_id=parent_id).order_by('name'):
children.append({
"id": "folder" + str(folder.id),
"text": folder.name,
"type": "folder",
"state": {"opened": True},
"children": get_children_recurse(folder.id)
})
for sub in Subscription.objects.filter(parent_folder_id=parent_id).order_by('name'):
children.append({
"id": "sub" + str(sub.id),
"type": "sub",
"text": sub.name,
"icon": sub.icon_default
})
return children
def get_folders(parent_id, path=""):
folders = []
prefix = path + "/"
if len(path) == 0:
prefix = ""
for folder in SubscriptionFolder.objects.filter(parent_id=parent_id).order_by('name'):
folder_path = prefix + folder.name
folders.append({
"id": folder.id,
"text": folder_path
})
folders.extend(get_folders(folder.id, folder_path))
return folders
def ajax_get_children(request: HttpRequest):
return JsonResponse(get_children_recurse(None), safe=False)
def ajax_get_folders(request: HttpRequest):
return JsonResponse(get_folders(None), safe=False)
def ajax_edit_folder(request: HttpRequest):
if request.method == 'POST':
fid = request.POST['id']
name = request.POST['name']
parent_id = request.POST['parent']
FolderManager.create_or_edit(fid, name, parent_id)
return HttpResponse()
def ajax_delete_folder(request: HttpRequest, fid):
FolderManager.delete(fid)
return HttpResponse()
def ajax_edit_subscription(request: HttpRequest):
if request.method == 'POST':
sid = request.POST['id']
name = request.POST['name']
url = request.POST['url']
parent_id = request.POST['parent']
SubscriptionManager.create_or_edit(sid, url, name, parent_id)
return HttpResponse()
def ajax_delete_subscription(request: HttpRequest, sid):
SubscriptionManager.delete(sid)
return HttpResponse()
def ajax_list_videos(request: HttpRequest):
if request.method == 'POST':
type = request.POST['type']
id = request.POST['id']
context = {}
if type == 'sub':
context['videos'] = SubscriptionManager.list_videos(int(id))
else:
context['videos'] = FolderManager.list_videos(int(id))
return render(request, 'YtManagerApp/index_videos.html', context)
def index(request: HttpRequest):
context = {}
return render(request, 'YtManagerApp/index.html', context)

View File

@ -0,0 +1,50 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, HTML, Submit
from django import forms
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from YtManagerApp.models import UserSettings
class SettingsForm(forms.ModelForm):
class Meta:
model = UserSettings
exclude = ['user']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'form-horizontal'
self.helper.label_class = 'col-lg-3'
self.helper.field_class = 'col-lg-9'
self.helper.layout = Layout(
'mark_deleted_as_watched',
'delete_watched',
HTML('<h2>Download settings</h2>'),
'auto_download',
'download_path',
'download_file_pattern',
'download_format',
'download_order',
'download_global_limit',
'download_subscription_limit',
HTML('<h2>Subtitles download settings</h2>'),
'download_subtitles',
'download_subtitles_langs',
'download_subtitles_all',
'download_autogenerated_subtitles',
'download_subtitles_format',
Submit('submit', value='Save')
)
class SettingsView(UpdateView):
form_class = SettingsForm
model = UserSettings
template_name = 'YtManagerApp/settings.html'
success_url = reverse_lazy('home')
def get_object(self, queryset=None):
obj, _ = self.model.objects.get_or_create(user=self.request.user)
return obj