From 1f03c6694468650281f1f7634b7462e299765197 Mon Sep 17 00:00:00 2001 From: Oliver Falk Date: Thu, 5 Jul 2018 14:11:52 +0200 Subject: [PATCH] Feature: Userpreferences --- ivatar/ivataraccount/forms.py | 14 +++++++ .../migrations/0008_userpreference.py | 35 ++++++++++++++++ .../migrations/0009_auto_20180705_1152.py | 18 ++++++++ .../migrations/0010_auto_20180705_1201.py | 18 ++++++++ ivatar/ivataraccount/models.py | 26 ++++++++++++ .../ivataraccount/templates/preferences.html | 20 +++++++++ ivatar/ivataraccount/urls.py | 2 + ivatar/ivataraccount/views.py | 17 +++++++- ivatar/static/css/falko.css | 41 +++++++++++++++++++ ivatar/tools/templates/check.html | 12 +++--- templates/base.html | 1 + templates/header.html | 5 +++ 12 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 ivatar/ivataraccount/migrations/0008_userpreference.py create mode 100644 ivatar/ivataraccount/migrations/0009_auto_20180705_1152.py create mode 100644 ivatar/ivataraccount/migrations/0010_auto_20180705_1201.py create mode 100644 ivatar/ivataraccount/templates/preferences.html create mode 100644 ivatar/static/css/falko.css diff --git a/ivatar/ivataraccount/forms.py b/ivatar/ivataraccount/forms.py index bb3a625..8991463 100644 --- a/ivatar/ivataraccount/forms.py +++ b/ivatar/ivataraccount/forms.py @@ -16,6 +16,7 @@ from ivatar.settings import MIN_LENGTH_EMAIL, MAX_LENGTH_EMAIL from ivatar.settings import MIN_LENGTH_URL, MAX_LENGTH_URL from . models import UnconfirmedEmail, ConfirmedEmail, Photo from . models import UnconfirmedOpenId, ConfirmedOpenId +from . models import UserPreference MAX_NUM_UNCONFIRMED_EMAILS_DEFAULT = 5 @@ -180,3 +181,16 @@ class AddOpenIDForm(forms.Form): unconfirmed.save() return unconfirmed.pk + +class UpdatePreferenceForm(forms.ModelForm): + ''' + Form for updating user preferences + ''' + + class Meta: + ''' + Meta class for UpdatePreferenceForm + ''' + model = UserPreference + fields = ['theme'] + diff --git a/ivatar/ivataraccount/migrations/0008_userpreference.py b/ivatar/ivataraccount/migrations/0008_userpreference.py new file mode 100644 index 0000000..5f76f52 --- /dev/null +++ b/ivatar/ivataraccount/migrations/0008_userpreference.py @@ -0,0 +1,35 @@ +# Generated by Django 2.0.6 on 2018-07-04 12:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +def add_preference_to_user(apps, schema_editor): + ''' + Make sure all users have preferences set up + ''' + from django.contrib.auth.models import User + UserPreference = apps.get_model('ivataraccount', 'UserPreference') + for u in User.objects.filter(userpreference=None): + p = UserPreference.objects.create(user_id=u.pk) + p.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ('ivataraccount', '0007_auto_20180627_0624'), + ] + + operations = [ + migrations.CreateModel( + name='UserPreference', + fields=[ + ('theme', models.CharField(choices=[('default', 'Default theme'), ('clime', 'Climes theme')], default='default', max_length=10)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.RunPython(add_preference_to_user), + ] diff --git a/ivatar/ivataraccount/migrations/0009_auto_20180705_1152.py b/ivatar/ivataraccount/migrations/0009_auto_20180705_1152.py new file mode 100644 index 0000000..ecd9e0f --- /dev/null +++ b/ivatar/ivataraccount/migrations/0009_auto_20180705_1152.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2018-07-05 11:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ivataraccount', '0008_userpreference'), + ] + + operations = [ + migrations.AlterField( + model_name='userpreference', + name='theme', + field=models.CharField(choices=[('default', 'Default theme'), ('clime', 'climes theme'), ('falko', 'falkos theme')], default='default', max_length=10), + ), + ] diff --git a/ivatar/ivataraccount/migrations/0010_auto_20180705_1201.py b/ivatar/ivataraccount/migrations/0010_auto_20180705_1201.py new file mode 100644 index 0000000..a0f162d --- /dev/null +++ b/ivatar/ivataraccount/migrations/0010_auto_20180705_1201.py @@ -0,0 +1,18 @@ +# Generated by Django 2.0.6 on 2018-07-05 12:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ivataraccount', '0009_auto_20180705_1152'), + ] + + operations = [ + migrations.AlterField( + model_name='userpreference', + name='theme', + field=models.CharField(choices=[('default', 'Default theme'), ('falko', 'falkos theme')], default='default', max_length=10), + ), + ] diff --git a/ivatar/ivataraccount/models.py b/ivatar/ivataraccount/models.py index 7e3bb15..70eaf7b 100644 --- a/ivatar/ivataraccount/models.py +++ b/ivatar/ivataraccount/models.py @@ -57,6 +57,32 @@ def pil_format(image_type): return None +class UserPreference(models.Model): + ''' + Holds the user users preferences + ''' + THEMES = ( + ('default', 'Default theme'), + # ('clime', 'climes theme'), # Not yet available + ('falko', 'falkos theme'), + ) + + theme = models.CharField( + max_length=10, + choices=THEMES, + default='default', + ) + + user = models.OneToOneField( + User, + on_delete=models.deletion.CASCADE, + primary_key=True, + ) + + def __str__(self): + return '' % (self.pk, self.user) + + class BaseAccountModel(models.Model): ''' Base, abstract model, holding fields we use in all cases diff --git a/ivatar/ivataraccount/templates/preferences.html b/ivatar/ivataraccount/templates/preferences.html new file mode 100644 index 0000000..54c9e82 --- /dev/null +++ b/ivatar/ivataraccount/templates/preferences.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load bootstrap4 %} +{% load static %} + +{% block title %}{% trans 'Your Preferences' %}{% endblock title %} + +{% block content %} + +
+
{% csrf_token %} + {% bootstrap_form form %} + {% buttons %} + + + {% endbuttons %} +
+
+ +{% endblock content %} diff --git a/ivatar/ivataraccount/urls.py b/ivatar/ivataraccount/urls.py index bf6871b..fb64a66 100644 --- a/ivatar/ivataraccount/urls.py +++ b/ivatar/ivataraccount/urls.py @@ -13,6 +13,7 @@ from . views import ImportPhotoView, RawImageView, DeletePhotoView from . views import UploadPhotoView, AssignPhotoOpenIDView from . views import AddOpenIDView, RedirectOpenIDView, ConfirmOpenIDView from . views import CropPhotoView +from . views import UserPreferenceView # Define URL patterns, self documenting # To see the fancy, colorful evaluation of these use: @@ -73,4 +74,5 @@ urlpatterns = [ # pylint: disable=invalid-name DeletePhotoView.as_view(), name='delete_photo'), url(r'raw_image/(?P\d+)', RawImageView.as_view(), name='raw_image'), url(r'crop_photo/(?P\d+)', CropPhotoView.as_view(), name='crop_photo'), + url(r'pref/$', UserPreferenceView.as_view(), name='user_preference'), ] diff --git a/ivatar/ivataraccount/views.py b/ivatar/ivataraccount/views.py index 93ab528..0ec9d17 100644 --- a/ivatar/ivataraccount/views.py +++ b/ivatar/ivataraccount/views.py @@ -5,7 +5,7 @@ from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.contrib.messages.views import SuccessMessageMixin from django.contrib import messages -from django.views.generic.edit import FormView +from django.views.generic.edit import FormView, UpdateView from django.views.generic.base import View, TemplateView from django.views.generic.detail import DetailView from django.contrib.auth import authenticate, login @@ -19,8 +19,10 @@ from openid import oidutil from openid.consumer import consumer from .forms import AddEmailForm, UploadPhotoForm, AddOpenIDForm +from .forms import UpdatePreferenceForm from .models import UnconfirmedEmail, ConfirmedEmail, Photo from .models import UnconfirmedOpenId, ConfirmedOpenId, DjangoOpenIDStore +from .models import UserPreference from ivatar.settings import MAX_NUM_PHOTOS, MAX_PHOTO_SIZE @@ -561,3 +563,16 @@ class CropPhotoView(TemplateView): pass # Ignore automatic assignment return photo.perform_crop(request, dimensions, email, openid) + +@method_decorator(login_required, name='dispatch') +class UserPreferenceView(FormView, UpdateView): + ''' + View class for user preferences view/update + ''' + template_name = 'preferences.html' + model = UserPreference + form_class = UpdatePreferenceForm + success_url = reverse_lazy('user_preference') + + def get_object(self): + return self.request.user.userpreference diff --git a/ivatar/static/css/falko.css b/ivatar/static/css/falko.css new file mode 100644 index 0000000..6d10382 --- /dev/null +++ b/ivatar/static/css/falko.css @@ -0,0 +1,41 @@ +/* Main palette from http://www.colourlovers.com/palette/4581580/Dr._Hans_6 */ + +body { + background-color: #DEE8F1; +} + +#site-name { + color: #675E57; +} + +#site-branding { + color: #4F6384; +} + +h1 { + color: #675E57; +} + +h2 { + color: #4F6384; +} + +#outer { + background-color: #9AB5D2; +} + +a { + color: #675E57; +} + +#content { + background-color: #FFFFFF; +} + +#content a { + color: #4F6384; +} + +.fas, .fab { + color: #675E57; +} diff --git a/ivatar/tools/templates/check.html b/ivatar/tools/templates/check.html index 0569d8b..c9ec32d 100644 --- a/ivatar/tools/templates/check.html +++ b/ivatar/tools/templates/check.html @@ -40,7 +40,7 @@ -
+

@@ -53,7 +53,7 @@ -
+

@@ -67,7 +67,7 @@ -
+

@@ -80,7 +80,7 @@ -
+

@@ -96,7 +96,7 @@ -
+

@@ -109,7 +109,7 @@ -
+

diff --git a/templates/base.html b/templates/base.html index 3894a04..606d85c 100644 --- a/templates/base.html +++ b/templates/base.html @@ -23,6 +23,7 @@
{% if user.is_authenticated %} {% trans 'Profile' %} |  + {% trans 'Preferences' %} |  {% trans 'Check' %} |  {% trans 'Contact Us' %} |  {% trans 'Security' %} |  diff --git a/templates/header.html b/templates/header.html index ce8f1bb..5fd91de 100644 --- a/templates/header.html +++ b/templates/header.html @@ -20,6 +20,11 @@ +{% if user.is_authenticated %} + {% if user.userpreference and user.userpreference.theme != 'default' %} + + {% endif %} +{% endif %}