mirror of
				https://github.com/chibicitiberiu/ytsm.git
				synced 2024-02-24 05:43:31 +00:00 
			
		
		
		
	Integrated django_dynamic_preferences for setting management.
This commit is contained in:
		@@ -32,6 +32,8 @@ INSTALLED_APPS = [
 | 
			
		||||
    'django.contrib.messages',
 | 
			
		||||
    'django.contrib.staticfiles',
 | 
			
		||||
    'django.contrib.humanize',
 | 
			
		||||
    'dynamic_preferences',
 | 
			
		||||
    'dynamic_preferences.users.apps.UserPreferencesConfig',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
MIDDLEWARE = [
 | 
			
		||||
@@ -58,6 +60,7 @@ TEMPLATES = [
 | 
			
		||||
                'django.template.context_processors.media',
 | 
			
		||||
                'django.contrib.auth.context_processors.auth',
 | 
			
		||||
                'django.contrib.messages.context_processors.messages',
 | 
			
		||||
                'dynamic_preferences.processors.global_preferences',
 | 
			
		||||
            ],
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										158
									
								
								app/YtManagerApp/dynamic_preferences_registry.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								app/YtManagerApp/dynamic_preferences_registry.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
from dynamic_preferences.types import BooleanPreference, StringPreference, IntegerPreference, ChoicePreference
 | 
			
		||||
from dynamic_preferences.preferences import Section
 | 
			
		||||
from dynamic_preferences.registries import global_preferences_registry
 | 
			
		||||
from dynamic_preferences.users.registries import user_preferences_registry
 | 
			
		||||
 | 
			
		||||
from YtManagerApp.models import VIDEO_ORDER_CHOICES
 | 
			
		||||
 | 
			
		||||
# we create some section objects to link related preferences together
 | 
			
		||||
 | 
			
		||||
hidden = Section('hidden')
 | 
			
		||||
general = Section('general')
 | 
			
		||||
scheduler = Section('scheduler')
 | 
			
		||||
manager = Section('manager')
 | 
			
		||||
downloader = Section('downloader')
 | 
			
		||||
 | 
			
		||||
# Hidden settings
 | 
			
		||||
@global_preferences_registry.register
 | 
			
		||||
class Initialized(BooleanPreference):
 | 
			
		||||
    section = hidden
 | 
			
		||||
    name = 'initialized'
 | 
			
		||||
    default = False
 | 
			
		||||
 | 
			
		||||
# General settings
 | 
			
		||||
@global_preferences_registry.register
 | 
			
		||||
class YouTubeAPIKey(StringPreference):
 | 
			
		||||
    section = general
 | 
			
		||||
    name = 'youtube_api_key'
 | 
			
		||||
    default = 'AIzaSyBabzE4Bup77WexdLMa9rN9z-wJidEfNX8'
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@global_preferences_registry.register
 | 
			
		||||
class SyncSchedule(StringPreference):
 | 
			
		||||
    section = scheduler
 | 
			
		||||
    name = 'synchronization_schedule'
 | 
			
		||||
    default = '5 * * * *' # hourly
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@global_preferences_registry.register
 | 
			
		||||
class SchedulerConcurrency(IntegerPreference):
 | 
			
		||||
    section = scheduler
 | 
			
		||||
    name = 'concurrency'
 | 
			
		||||
    default = 2
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
# User settings
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class MarkDeletedAsWatched(BooleanPreference):
 | 
			
		||||
    section = manager
 | 
			
		||||
    name = 'mark_deleted_as_watched'
 | 
			
		||||
    default = True
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class AutoDeleteWatched(BooleanPreference):
 | 
			
		||||
    section = manager
 | 
			
		||||
    name = 'auto_delete_watched'
 | 
			
		||||
    default = True
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class AutoDownloadEnabled(BooleanPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'enabled'
 | 
			
		||||
    default = True
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadGlobalLimit(IntegerPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'global_limit'
 | 
			
		||||
    default = None
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadGlobalSizeLimit(IntegerPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'global_size_limit_mb'
 | 
			
		||||
    default = None
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadSubscriptionLimit(IntegerPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'limit_per_subscription'
 | 
			
		||||
    default = 5
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadMaxAttempts(IntegerPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'max_attempts'
 | 
			
		||||
    default = 3
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadOrder(ChoicePreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'order'
 | 
			
		||||
    choices = VIDEO_ORDER_CHOICES
 | 
			
		||||
    default = 'playlist'
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadPath(StringPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'path'
 | 
			
		||||
    default = None
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadFilePattern(StringPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'file_pattern'
 | 
			
		||||
    default = '${channel}/${playlist}/S01E${playlist_index} - ${title} [${id}]'
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadFormat(StringPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'format'
 | 
			
		||||
    default = 'bestvideo+bestaudio'
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadSubtitles(BooleanPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'subtitles_enabled'
 | 
			
		||||
    default = True
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadAutogeneratedSubtitles(BooleanPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'autogenerated_subtitles'
 | 
			
		||||
    default = False
 | 
			
		||||
    required = True
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadAllSubtitles(BooleanPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'all_subtitles'
 | 
			
		||||
    default = False
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadSubtitlesLangs(StringPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'subtitles_langs'
 | 
			
		||||
    default = 'en,ro'
 | 
			
		||||
    required = False
 | 
			
		||||
 | 
			
		||||
@user_preferences_registry.register
 | 
			
		||||
class DownloadSubtitlesFormat(StringPreference):
 | 
			
		||||
    section = downloader
 | 
			
		||||
    name = 'subtitles_format'
 | 
			
		||||
    default = False
 | 
			
		||||
    required = False
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
{% extends "YtManagerApp/master_default.html" %}
 | 
			
		||||
{% load crispy_forms_tags %}
 | 
			
		||||
 | 
			
		||||
{% block body %}
 | 
			
		||||
 | 
			
		||||
    <div class="container">
 | 
			
		||||
        <h1>Welcome</h1>
 | 
			
		||||
        <p>This wizard will guide you through setting up the application.</p>
 | 
			
		||||
        {% crispy form %}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
{% endblock body %}
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
{% extends "YtManagerApp/master_default.html" %}
 | 
			
		||||
{% load crispy_forms_tags %}
 | 
			
		||||
 | 
			
		||||
{% block body %}
 | 
			
		||||
 | 
			
		||||
    <div class="container">
 | 
			
		||||
        <h1>Done!</h1>
 | 
			
		||||
        <p>The application is now ready to use!</p>
 | 
			
		||||
        {% crispy form %}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
{% endblock body %}
 | 
			
		||||
							
								
								
									
										51
									
								
								app/YtManagerApp/views/first_time.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								app/YtManagerApp/views/first_time.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
from crispy_forms.helper import FormHelper
 | 
			
		||||
from crispy_forms.layout import Layout, HTML, Submit
 | 
			
		||||
from django import forms
 | 
			
		||||
from django.contrib.auth.mixins import LoginRequiredMixin
 | 
			
		||||
from django.urls import reverse_lazy
 | 
			
		||||
from django.views.generic import UpdateView
 | 
			
		||||
 | 
			
		||||
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(LoginRequiredMixin, 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
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
; The global section contains settings that apply to the entire server
 | 
			
		||||
[global]
 | 
			
		||||
 | 
			
		||||
;Debug=False
 | 
			
		||||
Debug=True
 | 
			
		||||
 | 
			
		||||
; This is the folder where thumbnails will be downloaded. By default project_root/data/media is used.
 | 
			
		||||
;MediaRoot=
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ apscheduler
 | 
			
		||||
gunicorn
 | 
			
		||||
django 
 | 
			
		||||
django-crispy-forms 
 | 
			
		||||
django-dynamic-preferences
 | 
			
		||||
dj_database_url
 | 
			
		||||
youtube-dl 
 | 
			
		||||
google-api-python-client 
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user