diff --git a/README.md b/README.md index 29660f7..77128f2 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ This is for if you have a collection of comics on a media server and want to rea - [python 2.7](https://www.python.org/) - [rarfile python library by Marko Kreen](https://github.com/markokr/rarfile) (included) - [Unrar by winrar](http://rarlabs.com) +- [django-recaptcha bt praekelt](https://github.com/praekelt/django-recaptcha) # Installation Pull from git and use like any django project. diff --git a/cbreader/settings.py b/cbreader/settings.py index e2f5154..8f9ad96 100644 --- a/cbreader/settings.py +++ b/cbreader/settings.py @@ -37,7 +37,8 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'comic', + 'captcha', + 'comic', 'comic_auth', ) diff --git a/comic/forms.py b/comic/forms.py new file mode 100644 index 0000000..07fce5e --- /dev/null +++ b/comic/forms.py @@ -0,0 +1,50 @@ +from django import forms +from comic.models import Setting + + +class SettingsForm(forms.Form): + base_dir = forms.CharField(help_text='Base Directory', + widget=forms.TextInput( + attrs={ + 'class': 'form-control' + } + )) + recaptcha = forms.BooleanField(help_text='Use Recaptcha', + required=False, + widget=forms.CheckboxInput( + attrs={ + 'class': 'checkbox' + } + )) + recaptcha_public_key = forms.CharField(help_text='Recaptcha Public Key', + required=False, + widget=forms.TextInput( + attrs={ + 'class': 'form-control' + } + )) + recaptcha_private_key = forms.CharField(help_text='Recaptcha Private Key', + required=False, + widget=forms.TextInput( + attrs={ + 'class': 'form-control' + } + )) + + @staticmethod + def get_initial_values(): + base_dir, created = Setting.objects.get_or_create(name='BASE_DIR') + recaptcha_public_key, created = Setting.objects.get_or_create(name='RECAPTCHA_PUBLIC_KEY') + recaptcha_private_key, created = Setting.objects.get_or_create(name='RECAPTCHA_PRIVATE_KEY') + recaptcha, created = Setting.objects.get_or_create(name='RECAPTCHA_PRIVATE_KEY') + if recaptcha == '1': + recaptcha = True + else: + recaptcha = False + initial = { + 'base_dir': base_dir.value, + 'recaptcha': recaptcha, + 'recaptcha_public_key': recaptcha_public_key.value, + 'recaptcha_private_key': recaptcha_private_key.value, + } + return initial diff --git a/comic/templates/comic/settings_page.html b/comic/templates/comic/settings_page.html index 74f70c9..41b049e 100644 --- a/comic/templates/comic/settings_page.html +++ b/comic/templates/comic/settings_page.html @@ -6,6 +6,22 @@ {% if error_message %} {% endif %} +
+ {% csrf_token %} + {% for item in form %} +
+ + {{ item }} +
+ {% endfor %} + +
+{% endblock %} + +{% block content2 %} +{% if error_message %} + +{% endif %}
{% csrf_token %}
diff --git a/comic/views.py b/comic/views.py index d0a9cb7..7ed3d38 100644 --- a/comic/views.py +++ b/comic/views.py @@ -6,6 +6,7 @@ from django.contrib.auth.decorators import login_required from comic.models import Setting, ComicBook, ComicStatus from util import generate_breadcrumbs +from forms import SettingsForm from os import path @@ -27,26 +28,40 @@ def comic_list(request, comic_path=''): }) return render(request, 'comic/comic_list.html', context) + @login_required def settings_page(request): - obj, created = Setting.objects.get_or_create(name='BASE_DIR') error_message = '' + if request.POST: - if path.isdir(request.POST['base_directory']): - obj.value = request.POST['base_directory'] - obj.save() - else: - error_message = 'This is not a valid Directory' - elif obj.value == '': - error_message = 'Base Directory cannot be blank' - elif not path.isdir(obj.value): - error_message = 'Base Directory does not exist' + form = SettingsForm(request.POST) + if form.is_valid(): + if path.isdir(form.cleaned_data['base_dir']): + base_dir = Setting.objects.get(name='BASE_DIR') + base_dir.value = form.cleaned_data['base_dir'] + base_dir.save() + else: + error_message = 'This is not a valid Directory' + recap = Setting.objects.get(name='RECAPTCHA') + if form.cleaned_data['recaptcha']: + recap.value = '1' + else: + recap.value = '0' + recap.save() + rprik = Setting.objects.get(name='RECAPTCHA_PRIVATE_KEY') + rprik.value = form.cleaned_data['recaptcha_private_key'] + rprik.save() + rpubk = Setting.objects.get(name='RECAPTCHA_PUBLIC_KEY') + rpubk.value = form.cleaned_data['recaptcha_public_key'] + rpubk.save() + form = SettingsForm(initial=SettingsForm.get_initial_values()) context = RequestContext(request, { - 'base_dir': obj, 'error_message': error_message, + 'form': form, }) return render(request, 'comic/settings_page.html', context) + @login_required def read_comic(request, comic_path, page): base_dir = Setting.objects.get(name='BASE_DIR').value diff --git a/comic_auth/forms.py b/comic_auth/forms.py new file mode 100644 index 0000000..75eb739 --- /dev/null +++ b/comic_auth/forms.py @@ -0,0 +1,44 @@ +from django import forms +from captcha.fields import ReCaptchaField +from comic.models import Setting + +class LoginForm(forms.Form): + + username = forms.CharField(max_length=50, + label='', + widget=forms.TextInput( + attrs={ + 'class': 'form-control', + 'placeholder': 'Username', + 'autofocus': True, + 'required': True, + } + )) + password = forms.CharField(label='Password', + widget=forms.PasswordInput( + attrs={ + 'class': 'form-control', + 'placeholder': 'Username', + 'required': True, + } + )) + + def __init__(self, *args, **kwargs): + super(LoginForm, self).__init__(*args, **kwargs) + setting, created = Setting.objects.get_or_create(name='RECAPTCHA') + if created: + setting.value = '0' + if setting.value == '1': + public_key = Setting.objects.get(name='RECAPTCHA_PUBLIC_KEY').value + private_key = Setting.objects.get(name='RECAPTCHA_PRIVATE_KEY').value + + captcha = ReCaptchaField( + label='', + public_key=public_key, + private_key=private_key, + attrs={ + 'theme': 'white', + 'class': 'form-control', + } + ) + self.fields['captcha'] = captcha \ No newline at end of file diff --git a/comic_auth/templates/comic_auth/login.html b/comic_auth/templates/comic_auth/login.html index cead66f..7ab6502 100644 --- a/comic_auth/templates/comic_auth/login.html +++ b/comic_auth/templates/comic_auth/login.html @@ -1,5 +1,5 @@ {% extends "base.html" %} -{% block title %}CBreader Login{% endblock %} +{% block title %}CBWebReader - Login{% endblock %} {% block content %}
@@ -9,10 +9,7 @@ {% csrf_token %} - - - - + {{form}}
diff --git a/comic_auth/views.py b/comic_auth/views.py index ac98233..70f53c9 100644 --- a/comic_auth/views.py +++ b/comic_auth/views.py @@ -1,25 +1,38 @@ from django.shortcuts import render, redirect, RequestContext from django.contrib.auth import authenticate, login, logout +from comic_auth.forms import LoginForm def comic_login(request): if request.POST: - user = authenticate(username=request.POST['user'], - password=request.POST['password']) - if user is not None: - if user.is_active: - login(request, user) - if request.GET.has_key('next'): - return redirect(request.GET['next']) + form = LoginForm(request.POST) + if form.is_valid(): + user = authenticate(username=form.cleaned_data['username'], + password=form.cleaned_data['password']) + if user is not None: + if user.is_active: + login(request, user) + if request.GET.has_key('next'): + return redirect(request.GET['next']) + else: + return redirect('/comic/') else: - return redirect('/comic/') - else: - context = RequestContext(request, { - 'error': True - }) - return render(request, 'comic_auth/login.html', context) + context = RequestContext(request, { + 'error': True, + + }) + return render(request, 'comic_auth/login.html', context) + else: + context = RequestContext(request, { + 'error': True, + 'form': form + }) + return render(request, 'comic_auth/login.html', context) else: - context = RequestContext(request, {}) + form = LoginForm() + context = RequestContext(request, { + 'form': form + }) return render(request, 'comic_auth/login.html', context) def comic_logout(request):