Browse Source

add Account avatar field and upload view

master
Fr3deric 5 years ago
parent
commit
0195ee8d30
  1. 3
      cashonly/core/admin.py
  2. 20
      cashonly/core/migrations/0004_account_avatar.py
  3. 6
      cashonly/core/models.py
  4. 23
      cashonly/web/templates/cashonly/web/usersettings.html
  5. 18
      cashonly/web/views.py

3
cashonly/core/admin.py

@ -38,7 +38,8 @@ class AccountAdmin(admin.ModelAdmin): @@ -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'),

20
cashonly/core/migrations/0004_account_avatar.py

@ -0,0 +1,20 @@ @@ -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'),
),
]

6
cashonly/core/models.py

@ -39,6 +39,12 @@ class Account(models.Model): @@ -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

23
cashonly/web/templates/cashonly/web/usersettings.html

@ -64,6 +64,29 @@ $(document).ready(function() { @@ -64,6 +64,29 @@ $(document).ready(function() {
</div>
</div>
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-heading">{% trans "Change avatar" %}</div>
<div class="panel-body">
{% if user.account.avatar %}
<img src="{{ user.account.avatar.url }}" width="100%">
{% else %}
no avatar configured
{% endif %}
<form action="{% url 'usersettings' %}avatar/" method="post" enctype="multipart/form-data" id="pin-form" class="form-horizontal" role="form">
{% csrf_token %}
{{ avatar_form|bootstrap_horizontal:'col-sm-4' }}
<div class="form-group">
<div class="col-sm-offset-4 col-sm-8">
<input id="avatar-submit" type="submit" class="btn btn-primary" value="{% trans "Save" %}" />
<input id="avatar-submit-delete" type="submit" name="delete" class="btn btn-danger" value="{% trans "Delete avatar" %}" />
</div>
</div>
</form>
</div>
</div>
</div>
</div>

18
cashonly/web/views.py

@ -134,11 +134,17 @@ class UserPinForm(forms.Form): @@ -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): @@ -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})

Loading…
Cancel
Save