diff --git a/mhackspace/users/admin.py b/mhackspace/users/admin.py
index ce6d8e1..2c0a1cf 100644
--- a/mhackspace/users/admin.py
+++ b/mhackspace/users/admin.py
@@ -36,7 +36,7 @@ class MyUserAdmin(AuthUserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
fieldsets = (
- ('User Profile', {'fields': ('name',)}),
+ ('User Profile', {'fields': ('name', 'image')}),
) + AuthUserAdmin.fieldsets
list_display = ('username', 'name', 'is_superuser')
search_fields = ['name']
diff --git a/mhackspace/users/forms.py b/mhackspace/users/forms.py
new file mode 100644
index 0000000..73b16ff
--- /dev/null
+++ b/mhackspace/users/forms.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+from django.db import models
+from django.forms import ModelForm
+
+from .models import UserBlurb
+
+class UserBlurbForm(ModelForm):
+ class Meta:
+ model = UserBlurb
+ exclude = ['user']
diff --git a/mhackspace/users/migrations/0002_membership_userblurb.py b/mhackspace/users/migrations/0002_membership_userblurb.py
new file mode 100644
index 0000000..4e0c458
--- /dev/null
+++ b/mhackspace/users/migrations/0002_membership_userblurb.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.4 on 2017-01-06 08:53
+from __future__ import unicode_literals
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Membership',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('payment', models.DecimalField(decimal_places=2, max_digits=6)),
+ ('date', models.DateTimeField()),
+ ('reference', models.CharField(max_length=255)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='UserBlurb',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('skills', models.CharField(max_length=255)),
+ ('description', models.TextField()),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/mhackspace/users/migrations/0003_user_image.py b/mhackspace/users/migrations/0003_user_image.py
new file mode 100644
index 0000000..f55e304
--- /dev/null
+++ b/mhackspace/users/migrations/0003_user_image.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.4 on 2017-01-06 19:03
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0002_membership_userblurb'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='user',
+ name='image',
+ field=models.ImageField(blank=True, null=True, upload_to='/upload/avatars'),
+ ),
+ ]
diff --git a/mhackspace/users/migrations/0004_auto_20170106_2030.py b/mhackspace/users/migrations/0004_auto_20170106_2030.py
new file mode 100644
index 0000000..c98e20c
--- /dev/null
+++ b/mhackspace/users/migrations/0004_auto_20170106_2030.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.4 on 2017-01-06 20:30
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users', '0003_user_image'),
+ ]
+
+ operations = [
+ migrations.RenameModel(
+ old_name='Membership',
+ new_name='UserMembership',
+ ),
+ migrations.AlterField(
+ model_name='user',
+ name='image',
+ field=models.ImageField(blank=True, null=True, upload_to='avatars/'),
+ ),
+ ]
diff --git a/mhackspace/users/models.py b/mhackspace/users/models.py
index 0beebfb..cd6920c 100644
--- a/mhackspace/users/models.py
+++ b/mhackspace/users/models.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, absolute_import
+from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.core.urlresolvers import reverse
from django.db import models
@@ -10,13 +11,24 @@ from django.utils.translation import ugettext_lazy as _
@python_2_unicode_compatible
class User(AbstractUser):
-
- # First Name and Last Name do not cover name patterns
- # around the globe.
name = models.CharField(_('Name of User'), blank=True, max_length=255)
+ image = models.ImageField(upload_to='avatars/', blank=True, null=True)
def __str__(self):
return self.username
def get_absolute_url(self):
return reverse('users:detail', kwargs={'username': self.username})
+
+
+class UserBlurb(models.Model):
+ user = models.ForeignKey(settings.AUTH_USER_MODEL)
+ skills = models.CharField(max_length=255)
+ description = models.TextField()
+
+
+class UserMembership(models.Model):
+ user = models.ForeignKey(settings.AUTH_USER_MODEL)
+ payment = models.DecimalField(max_digits=6, decimal_places=2)
+ date = models.DateTimeField()
+ reference = models.CharField(max_length=255)
diff --git a/mhackspace/users/views.py b/mhackspace/users/views.py
index 4cfe64a..bbdfb07 100644
--- a/mhackspace/users/views.py
+++ b/mhackspace/users/views.py
@@ -7,7 +7,10 @@ from django.views.generic import DetailView, ListView, RedirectView, UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import User
+from .models import UserBlurb
+from .models import UserMembership
+from .forms import UserBlurbForm
class UserDetailView(LoginRequiredMixin, DetailView):
model = User
@@ -15,6 +18,12 @@ class UserDetailView(LoginRequiredMixin, DetailView):
slug_field = 'username'
slug_url_kwarg = 'username'
+ def get_context_data(self, **kwargs):
+ # xxx will be available in the template as the related objects
+ context = super(UserDetailView, self).get_context_data(**kwargs)
+ context['blurb'] = UserBlurb.objects.filter(user=self.get_object()).first()
+ context['membership'] = UserMembership.objects.filter(user=self.get_object()).first()
+ return context
class UserRedirectView(LoginRequiredMixin, RedirectView):
permanent = False
@@ -25,21 +34,34 @@ class UserRedirectView(LoginRequiredMixin, RedirectView):
class UserUpdateView(LoginRequiredMixin, UpdateView):
-
- fields = ['name', ]
-
- # we already imported User in the view code above, remember?
+ fields = ['name', 'image', ]
model = User
# send the user back to their own page after a successful update
def get_success_url(self):
- return reverse('users:detail',
- kwargs={'username': self.request.user.username})
+ return reverse(
+ 'users:detail',
+ kwargs={'username': self.request.user.username})
+
+ def get_context_data(self, **kwargs):
+ context = super(UserUpdateView, self).get_context_data(**kwargs)
+ profile = UserBlurb.objects.filter(user=self.get_object()).first()
+ context['form_blurb'] = UserBlurbForm(instance=profile)
+ return context
def get_object(self):
# Only get the User record for the user making the request
return User.objects.get(username=self.request.user.username)
+ def form_valid(self, form):
+ profile = UserBlurb.objects.filter(user=self.get_object()).first()
+ form_blurb = UserBlurbForm(self.request.POST, instance=profile)
+ if form_blurb.is_valid():
+ blurb_model = form_blurb.save(commit=False)
+ blurb_model.user = self.request.user
+ blurb_model.save()
+
+ return super(UserUpdateView, self).form_valid(form)
class UserListView(LoginRequiredMixin, ListView):
model = User