From 0195ee8d303fb166e5d1ed22b74e1ea7e2a13242 Mon Sep 17 00:00:00 2001 From: Frederic Date: Sat, 13 Apr 2019 23:33:02 +0200 Subject: [PATCH] add Account avatar field and upload view --- cashonly/core/admin.py | 3 ++- .../core/migrations/0004_account_avatar.py | 20 ++++++++++++++++ cashonly/core/models.py | 6 +++++ .../templates/cashonly/web/usersettings.html | 23 +++++++++++++++++++ cashonly/web/views.py | 18 ++++++++++++++- 5 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 cashonly/core/migrations/0004_account_avatar.py diff --git a/cashonly/core/admin.py b/cashonly/core/admin.py index f8ce117..63719bd 100644 --- a/cashonly/core/admin.py +++ b/cashonly/core/admin.py @@ -38,7 +38,8 @@ class AccountAdmin(admin.ModelAdmin): readonly_fields = ('user', 'credit',) fieldsets = ( (None, { - 'fields': ('user', 'card_number', 'credit', 'debit_limit'), + 'fields': ('user', 'card_number', 'credit', 'debit_limit', + 'avatar'), }), (ugettext_lazy('credit change'), { 'fields': ('credit_change', 'credit_change_comment'), diff --git a/cashonly/core/migrations/0004_account_avatar.py b/cashonly/core/migrations/0004_account_avatar.py new file mode 100644 index 0000000..ec1aa9e --- /dev/null +++ b/cashonly/core/migrations/0004_account_avatar.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-02-17 22:08 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cashonly_core', '0003_debit_limit_null_default'), + ] + + operations = [ + migrations.AddField( + model_name='account', + name='avatar', + field=models.ImageField(blank=True, null=True, upload_to='avatars', verbose_name='avatar'), + ), + ] diff --git a/cashonly/core/models.py b/cashonly/core/models.py index 6569741..102e395 100644 --- a/cashonly/core/models.py +++ b/cashonly/core/models.py @@ -39,6 +39,12 @@ class Account(models.Model): blank=True, null=True, ) + avatar = models.ImageField( + verbose_name=_('avatar'), + upload_to='avatars', + blank=True, + null=True, + ) def __str__(self): return self.user.username diff --git a/cashonly/web/templates/cashonly/web/usersettings.html b/cashonly/web/templates/cashonly/web/usersettings.html index 91f9d0e..308d603 100644 --- a/cashonly/web/templates/cashonly/web/usersettings.html +++ b/cashonly/web/templates/cashonly/web/usersettings.html @@ -64,6 +64,29 @@ $(document).ready(function() { +
+
+
{% trans "Change avatar" %}
+
+{% if user.account.avatar %} + +{% else %} + no avatar configured +{% endif %} +
+{% csrf_token %} +{{ avatar_form|bootstrap_horizontal:'col-sm-4' }} +
+
+ + +
+
+
+
+
+
+ diff --git a/cashonly/web/views.py b/cashonly/web/views.py index 04620d0..7bc8a55 100644 --- a/cashonly/web/views.py +++ b/cashonly/web/views.py @@ -134,11 +134,17 @@ class UserPinForm(forms.Form): return cleaned_data +class UserAvatarForm(forms.Form): + avatar = forms.FileField(max_length=32, label=ugettext_lazy('avatar'), + required=False) + + @login_required def usersettings(request, submit=None): daily_digest = request.user.account.daily_digest settings_form = UserSettingsForm({'daily_digest': daily_digest}) pin_form = UserPinForm() + avatar_form = UserAvatarForm() if request.method == 'POST': if submit == 'pin': @@ -161,6 +167,16 @@ def usersettings(request, submit=None): request.user.account.daily_digest = daily_digest request.user.account.save() return render(request, 'cashonly/web/usersettings_saved.html') + elif submit == 'avatar': + avatar_form = UserAvatarForm(request.POST, request.FILES) + if avatar_form.is_valid(): + if 'delete' in request.POST: + request.user.account.avatar = None + else: + request.user.account.avatar = avatar_form.cleaned_data['avatar'] + request.user.account.save() + return render(request, 'cashonly/web/usersettings_saved.html') return render(request, 'cashonly/web/usersettings.html', - {'settings_form': settings_form, 'pin_form': pin_form}) + {'settings_form': settings_form, 'pin_form': pin_form, + 'avatar_form': avatar_form})