Skip to content

Commit

Permalink
feat: ✨ add settings page
Browse files Browse the repository at this point in the history
  • Loading branch information
djdembeck committed Nov 13, 2021
1 parent 644a422 commit bf90b57
Show file tree
Hide file tree
Showing 8 changed files with 198 additions and 3 deletions.
30 changes: 30 additions & 0 deletions importer/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from django import forms
from .models import Setting

class SettingForm(forms.ModelForm):
class Meta:
model = Setting
fields = (
'api_url',
'completed_directory',
'input_directory',
'num_cpus',
'output_directory',
'output_scheme'
)
labels = {
'api_url': 'Custom API URL',
'completed_directory': 'Directory for original input files',
'input_directory': 'Input directory path',
'num_cpus': 'Number of CPUs to use (0 will use all available)',
'output_directory': 'Output directory path',
'output_scheme': 'Output format'
}
widgets = {
'api_url': forms.URLInput(attrs={'class': 'input is-fullwidth'}),
'completed_directory': forms.TextInput(attrs={'class': 'input is-fullwidth'}),
'input_directory': forms.TextInput(attrs={'class': 'input is-fullwidth'}),
'num_cpus': forms.NumberInput(attrs={'class': 'input is-fullwidth'}),
'output_directory': forms.TextInput(attrs={'class': 'input is-fullwidth'}),
'output_scheme': forms.TextInput(attrs={'class': 'input is-fullwidth'}),
}
27 changes: 27 additions & 0 deletions importer/migrations/0002_setting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 3.2.5 on 2021-11-13 22:04

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('importer', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Setting',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('api_url', models.CharField(max_length=255)),
('completed_directory', models.CharField(max_length=255)),
('input_directory', models.CharField(max_length=255)),
('num_cpus', models.IntegerField()),
('output_directory', models.CharField(max_length=255)),
('output_scheme', models.CharField(max_length=255)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
]
21 changes: 21 additions & 0 deletions importer/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.db import models
from pathlib import Path


class BookManager(models.Manager):
Expand All @@ -14,6 +15,15 @@ def book_asin_validator(self, asin):
return errors


class SettingManager(models.Manager):
def file_path_validator(self, path):
errors = {}

if not Path(path).is_dir():
errors['invalid_path'] = f"Path is not a directory: {path}"
return errors


class Book(models.Model):
title = models.CharField(max_length=255)
asin = models.CharField(max_length=10)
Expand Down Expand Up @@ -63,3 +73,14 @@ class Genre(models.Model):
narrators = models.ManyToManyField(Narrator, related_name="genres")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Setting(models.Model):
api_url = models.CharField(max_length=255)
completed_directory = models.CharField(max_length=255)
input_directory = models.CharField(max_length=255)
num_cpus = models.IntegerField()
output_directory = models.CharField(max_length=255)
output_scheme = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = SettingManager()
1 change: 1 addition & 0 deletions importer/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<li {% if url_name == 'home' %}class="is-active" aria-current="page"{% endif %}><a {% if url_name == 'home' %}class="has-text-weight-light"{% endif %} href="{% url 'home' %}">Import</a></li>
<li {% if url == 'match' %}class="is-active" aria-current="page"{% endif %}><a {% if url_name == 'match' %}class="has-text-weight-light"{% endif %} href="{% url 'match' %}">Match</a></li>
<li {% if url == 'finish' %}class="is-active" aria-current="page"{% endif %}><a {% if url_name == 'finish' %}class="has-text-weight-light"{% endif %} href="{% url 'finish' %}">Confirm</a></li>
<li {% if url == 'setting' %}class="is-active" aria-current="page"{% endif %}><a {% if url_name == 'setting' %}class="has-text-weight-light"{% endif %} href="{% url 'setting' %}">Settings</a></li>
</ul>
{% endwith %}
</nav>
Expand Down
38 changes: 38 additions & 0 deletions importer/templates/setting.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{% extends "base.html" %}
{% block content %}
<div class="columns">
<div class="column">
<div class="card">
<div class="card-header is-center">
<div class="card-header-title">
<p class="title">Settings</p>
</div>
</div>
<form action="/import/setting" method="POST">
{% csrf_token %}
<div class="card-content">
{% for field in form %}
<div class="field is-horizontal">
<div class="field-body">
<div class="field">
{{ field.label_tag }}
<div class="control">
{{ field }}
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<footer class="card-footer">
<div class="card-footer-item">
<div class="control">
<button class="button is-link is-fullwidth">Save</button>
</div>
</div>
</footer>
</form>
</div>
</div>
</div>
{% endblock %}
1 change: 1 addition & 0 deletions importer/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
urlpatterns = [
path('', views.ImportView.as_view(), name='home'),
path('match', views.MatchView.as_view(), name='match'),
path('setting', views.SettingView.as_view(), name='setting'),
path('confirm', views.FinishView.as_view(), name='finish'),
]
72 changes: 71 additions & 1 deletion importer/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
from pathlib import Path
import logging
import os
# Forms import
from .forms import SettingForm
# Models import
from .models import Book
from .models import Book, Setting
# core merge logic:
from m4b_merge import helpers
# Import Merge functions for django
Expand Down Expand Up @@ -132,6 +134,74 @@ def post(self, request):
return redirect("finish")


class SettingView(TemplateView):
template_name = "setting.html"

def get_context_data(self, **kwargs):
existing_settings = Setting.objects.first()
default_data = {
'api_url': 'https://api.audnex.us',
'completed_directory': '/input/done',
'input_directory': '/input',
'num_cpus': 0,
'output_directory': '/output',
'output_scheme': 'placeholder'
}
if existing_settings:
form = SettingForm(instance=existing_settings)
else:
form = SettingForm(initial=default_data)
all_settings = Setting.objects.first()

context = {
"form": form,
"settings": all_settings,
}
return context

def post(self, request):
existing_settings = Setting.objects.first()

form = SettingForm(request.POST)
if form.is_valid():
paths_to_check = [
'completed_directory',
'input_directory',
'output_directory'
]
form_data = form.cleaned_data

# Check file path validity
for path in paths_to_check:
errors = Setting.objects.file_path_validator(form_data[path])
if len(errors) > 0:
for k, v in errors.items():
messages.error(request, v)
return redirect("setting")
if not existing_settings:
settings = Setting.objects.create(
api_url = form_data['api_url'],
completed_directory = form_data['completed_directory'],
input_directory = form_data['input_directory'],
num_cpus = form_data['num_cpus'],
output_directory = form_data['output_directory'],
output_scheme = form_data['output_scheme']
)
settings.save()
else:
existing_settings.api_url = form_data['api_url']
existing_settings.completed_directory = form_data['completed_directory']
existing_settings.input_directory = form_data['input_directory']
existing_settings.num_cpus = form_data['num_cpus']
existing_settings.output_directory = form_data['output_directory']
existing_settings.output_scheme = form_data['output_scheme']
existing_settings.save()
return redirect("home")
else:
messages.error(request, "Form is invalid")
return redirect("setting")


class FinishView(TemplateView):
template_name = "finish.html"

Expand Down
11 changes: 9 additions & 2 deletions utils/merge.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import logging
from datetime import datetime
from importer.models import Book, Author, Narrator
from importer.models import Book, Author, Narrator, Setting
# core merge logic:
from m4b_merge import audible_helper, m4b_helper
from m4b_merge import audible_helper, config, m4b_helper

# Get an instance of a logger
logger = logging.getLogger(__name__)
Expand All @@ -25,6 +25,13 @@ def run_m4b_merge(self):
self.m4b = m4b_helper.M4bMerge(
self.input_data, self.metadata, self.chapters
)
# Check/apply settings
existing_settings = Setting.objects.first()
if existing_settings:
config.api_url = existing_settings.api_url
config.junk_dir = existing_settings.completed_directory
config.num_cpus = existing_settings.num_cpus
config.output = existing_settings.output_directory
self.m4b.run_merge()

# Make models only if book doesn't exist
Expand Down

0 comments on commit bf90b57

Please sign in to comment.