From 97de26ea85e7410ba0e470886f11d8e7ac8fd2f8 Mon Sep 17 00:00:00 2001 From: Michael Hall Date: Sun, 18 Mar 2018 12:26:32 -0400 Subject: [PATCH] Add a placeholder local avatar image for users who don't set one. Fix screens where a missing avatar caused errors. Fixes #53, Fixes #50 --- events/forms.py | 4 +- events/models/profiles.py | 7 +++- events/templates/events/profile_form.html | 2 +- .../static/img/avatar_placeholder.png | Bin 0 -> 2449 bytes .../new_user/setup_1_confirm_profile.html | 10 +---- get_together/tests/__init__.py | 12 +----- get_together/tests/events.py | 38 ++++++++++++++++++ get_together/views/new_user.py | 2 +- 8 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 get_together/static/img/avatar_placeholder.png create mode 100644 get_together/tests/events.py diff --git a/events/forms.py b/events/forms.py index 9fe6f79..90010be 100644 --- a/events/forms.py +++ b/events/forms.py @@ -220,7 +220,7 @@ class UserForm(forms.ModelForm): class UserProfileForm(forms.ModelForm): class Meta: model = UserProfile - fields = ['realname', 'avatar', 'send_notifications'] + fields = ['avatar', 'realname', 'tz', 'send_notifications'] labels = { 'send_notifications': _('Send me notification emails'), } @@ -228,7 +228,7 @@ class UserProfileForm(forms.ModelForm): class ConfirmProfileForm(forms.ModelForm): class Meta: model = UserProfile - fields = ['realname', 'tz'] + fields = ['avatar', 'realname', 'tz'] class SendNotificationsForm(forms.ModelForm): class Meta: diff --git a/events/models/profiles.py b/events/models/profiles.py index ec66d89..7127dfb 100644 --- a/events/models/profiles.py +++ b/events/models/profiles.py @@ -22,7 +22,8 @@ class UserProfile(models.Model): avatar = ProcessedImageField(verbose_name=_("Photo Image"), upload_to='avatars', processors=[ResizeToFill(128, 128)], - format='PNG') + format='PNG', + blank=True) web_url = models.URLField(verbose_name=_('Website URL'), blank=True, null=True) twitter = models.CharField(verbose_name=_('Twitter Name'), max_length=32, blank=True, null=True) @@ -45,7 +46,9 @@ class UserProfile(models.Model): return "Unknown Profile" def avatar_url(self): - if self.avatar.name.startswith('http'): + if self.avatar is None or self.avatar == '': + return settings.STATIC_URL + 'img/avatar_placeholder.png' + elif self.avatar.name.startswith('http'): return self.avatar.name else: return self.avatar.url diff --git a/events/templates/events/profile_form.html b/events/templates/events/profile_form.html index c8fd498..6772da3 100644 --- a/events/templates/events/profile_form.html +++ b/events/templates/events/profile_form.html @@ -1,4 +1,4 @@ -{{ user_form }} {{ profile_form }} +{{ user_form }}
diff --git a/get_together/static/img/avatar_placeholder.png b/get_together/static/img/avatar_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5cf254cc17b88ea07e926557a3083aca89227f GIT binary patch literal 2449 zcmWlb2{hFE7r=kNF&HD7nH14uESb?L`&c4_!I)&H$-ZTKEn^g($RISvHq;x6Xl(gs zEt03KFH4bn!l}eWPnHZ%C|mRYIp6dB-gED{=X=h*-+Mpz%W`tCl|srR0RWJ)qmW%7 z$=urrG3e|$74QlYVu7b^$$)Tgl|HY^hb$6w%DE^2kUX%rLEui29Ap%~Vt2+`d|Cv9 zk`U#F9QK0T6z#|sZm}PhieEXp`pBjynt3A+$s{rCZZlYTtQ-{x$`twSX2H#*g0R3M zqgg2rxs34IrV6v=&Zd&8nLML=m~k8`bCdQr8;?evGejUWLw*Opk`%b$*bwflWu?Q8#|B7 zT{N+QvS`oKV*fxqtqd#+KExtZ<1WfLuun0)gQ4a5U`l<*BChWrY~;wrHuIo}P&i zKmbQsqs`3BVpsU!fu%;z+NY5-Vw#5}B^uE7_V)a(^+o&UfeXa4*4D!(xNJD$=n1Z* zl$6x3+opfMnZGh85U7Keb}=!AYjI|eXE0edDTRfHF<2Q*Ev>TZYSujQj=lP`Yd2GRVz6>@`^1cnNDF4iO^UPO2(gk=2_II9 z+x@k5buD4=lAo+WPqm7=Mv=aft?p?#~JFV;v%oVTfeFf-gj_q9m}`|(#&m{=Rh8h zhf+{@m9Uk=W~+i@1Yo&}PEo^9DqJxB&tVOU&zcd~`~eDcy?Z;!UX8?Tm`toYFV?vQ z-Wm)A?uEiIEV$Q`3(6o2&HNe(?Dvryf%OOL*0q6(*_ZnuT?1pN zGF_^_M0gqDaOrpRqA$Vu8X{k2XIJxUW5a@@qlsq^Gr7M?6u`ispjLTA9-!<$Ugt9b zH&9hgfg^~Uo15NE`7MGB1u%Mfa%gBDvucO{-BIB;G&FP+v`iwad=5;pu6D}#qRvndAu~(-%mcGLBf@2vr#W)l$+nOj(}^z&1SsWvb+KJ4!9Zbat;Bg+VF4H9JaeIA$E z)ny^5&l-6B+6Dqo_7UUm;QI(y*xJU1<-^gy`1qp5ZCK*ra7h^Sj?TWm*$`DKslA3i zK>awx2w(o>R24=HOHV8sY5he3Q+#vbGjoSXd~SlP8`5(tE&K5B8HM#KEB<<$oYR zzIgG%C}B$<3ZdH%m|E9}ii&y@rvE0QncnsZ+s@?_n_NXgKDh(I3Z70F21s_kF&dFN z5Nvt&tnB2oKdc;g4Ez6O95IWNIe73O<@D)~xy3JXkt>_uL+94xo?YLSS2Dj|j(cV^ zJv~id;al9|a?2VTw9DOXl+mR6@jZmrj|W9WWZauGVX;_Ulh3a?dw8T-rAsSoXs|AV zX=!PtZ^Qic<#kS;Jng7`Qw6HnZ&MvgILCYYBF0fNpgIm0`9t6Xu|ptxiKcF1BLA`F zvhCHY22jXEKY;rxb#^wSsij3P(cJebr?8MEDSLuc;d1dA08#YK;`-CL^<&>#g3?c> z?^o)5|2UMBm-nbHt19u3e{}Srt#zb3;Rt+({8-1Ia8uj&c?dGjK1Bp_Phmpcx z34;2l9GTVCRVP2cj!NW02XbZQvz5MqK~l;~ooVq~)T1YS{#qNiU+G(T$<^}XH8ye- zPo?kidv@qAH8bX6N>gAYrgsP>G@xPo}Qj|p}kCn zc5h3TkPYzgfe{hNsrH02e5$d>!}ThYGhJMH2+VjBG_&V(=g*%%>tRqhPFGaOOfA3m z9Zd+ey=!aw);QQotf~3X+79f^nid0Uv<@W6tDV!cx~h9bx=#p4d_DV!HCmO@E*mB4 zEMv!{90Go}OOVOZJp5K$yoCw}tFE5L!&o4a`5ogFfCM9#0_{CSQQ&4yPSpc4sqD=(l

Please confirm your profile information

-
+ {% csrf_token %}

{% include "events/profile_form.html" %}

@@ -19,12 +19,4 @@ {% endblock %} -{% block javascript %} - - -{% endblock %} diff --git a/get_together/tests/__init__.py b/get_together/tests/__init__.py index d849e25..7fe0e06 100644 --- a/get_together/tests/__init__.py +++ b/get_together/tests/__init__.py @@ -1,14 +1,4 @@ from django.test import TestCase -# Create your tests here. -class BaseTest(TestCase): - - def setUp(self): - super().setUp() - - def tearDown(self): - super().tearDown() - - def test_harness(self): - return +from .events import * diff --git a/get_together/tests/events.py b/get_together/tests/events.py new file mode 100644 index 0000000..3a14913 --- /dev/null +++ b/get_together/tests/events.py @@ -0,0 +1,38 @@ +from django.test import TestCase, Client +from model_mommy import mommy + +from django.contrib.auth.models import User +from events.models import Event, Attendee, UserProfile +# Create your tests here. +class EventDisplayTests(TestCase): + + def setUp(self): + super().setUp() + + def tearDown(self): + super().tearDown() + + def test_show_event(self): + event = mommy.make(Event) + event.save() + + event_url = event.get_absolute_url() + + c = Client() + response = c.get(event_url) + assert(response.status_code == 200) + + def test_show_event_attendee_without_avatar(self): + event = mommy.make(Event) + event.save() + + profile = mommy.make(UserProfile, avatar='') + profile.save() + + attendee = mommy.make(Attendee, event=event, user=profile, role=Attendee.NORMAL, status= Attendee.YES) + attendee.save() + + c = Client() + response = c.get(event.get_absolute_url()) + assert(response.status_code == 200) + diff --git a/get_together/views/new_user.py b/get_together/views/new_user.py index 30d0a2c..eaeb810 100644 --- a/get_together/views/new_user.py +++ b/get_together/views/new_user.py @@ -35,7 +35,7 @@ def setup_1_confirm_profile(request): return render(request, 'get_together/new_user/setup_1_confirm_profile.html', context) elif request.method == 'POST': user_form = UserForm(request.POST, instance=user) - profile_form = ConfirmProfileForm(request.POST, instance=profile) + profile_form = ConfirmProfileForm(request.POST, request.FILES, instance=profile) if user_form.is_valid() and profile_form.is_valid(): saved_user = user_form.save() profile_form.save()