diff --git a/accounts/__init__.py b/accounts/__init__.py new file mode 100644 index 0000000..8319823 --- /dev/null +++ b/accounts/__init__.py @@ -0,0 +1 @@ +default_app_config = 'accounts.apps.AccountsConfig' diff --git a/accounts/apps.py b/accounts/apps.py new file mode 100644 index 0000000..f4628d2 --- /dev/null +++ b/accounts/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + name = 'accounts' + + def ready(self): + import accounts.signals # noqa diff --git a/accounts/forms.py b/accounts/forms.py new file mode 100644 index 0000000..2c3618e --- /dev/null +++ b/accounts/forms.py @@ -0,0 +1,20 @@ +from django.contrib.auth.forms import AuthenticationForm +from django.utils.translation import ugettext_lazy as _ +from django.forms.models import modelform_factory + + +from .models import User, Profile + + +# email MUST be validated, we do not allow to edit it +UserForm = modelform_factory(User, fields=['first_name', 'last_name', 'username']) + +ProfileForm = modelform_factory(Profile, fields=[ + 'phone_number', 'biography', 'twitter', 'website', + 'linkedin', 'facebook', 'mastodon']) + + +class EmailAuthenticationForm(AuthenticationForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['username'].label = _('Email address') diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py new file mode 100644 index 0000000..130f19d --- /dev/null +++ b/accounts/migrations/0001_initial.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.1 on 2017-11-18 20:14 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +def profile_forward(apps, schema_editor): + User = apps.get_model(settings.AUTH_USER_MODEL) + Profile = apps.get_model("accounts", "Profile") + db_alias = schema_editor.connection.alias + for user in User.objects.using(db_alias).all(): + Profile.objects.using(db_alias).get_or_create(user=user) + + +def profile_backward(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('phone_number', models.CharField(blank=True, default='', max_length=16, verbose_name='Phone number')), + ('sms_prefered', models.BooleanField(default=False, verbose_name='SMS prefered')), + ('biography', models.TextField(blank=True, verbose_name='Biography')), + ('twitter', models.CharField(blank=True, default='', max_length=100, verbose_name='Twitter')), + ('linkedin', models.CharField(blank=True, default='', max_length=100, verbose_name='LinkedIn')), + ('github', models.CharField(blank=True, default='', max_length=100, verbose_name='Github')), + ('website', models.CharField(blank=True, default='', max_length=100, verbose_name='Website')), + ('facebook', models.CharField(blank=True, default='', max_length=100, verbose_name='Facebook')), + ('mastodon', models.CharField(blank=True, default='', max_length=100, verbose_name='Mastodon')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.RunPython(profile_forward, profile_backward), + ] diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/accounts/models.py b/accounts/models.py new file mode 100644 index 0000000..146f0fe --- /dev/null +++ b/accounts/models.py @@ -0,0 +1,25 @@ +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class Profile(models.Model): + + user = models.OneToOneField(User) + phone_number = models.CharField(max_length=16, blank=True, default='', verbose_name=_('Phone number')) + sms_prefered = models.BooleanField(default=False, verbose_name=_('SMS prefered')) + biography = models.TextField(blank=True, verbose_name=_('Biography')) + + twitter = models.CharField(max_length=100, blank=True, default='', verbose_name=_('Twitter')) + linkedin = models.CharField(max_length=100, blank=True, default='', verbose_name=_('LinkedIn')) + github = models.CharField(max_length=100, blank=True, default='', verbose_name=_('Github')) + website = models.CharField(max_length=100, blank=True, default='', verbose_name=_('Website')) + facebook = models.CharField(max_length=100, blank=True, default='', verbose_name=_('Facebook')) + mastodon = models.CharField(max_length=100, blank=True, default='', verbose_name=_('Mastodon')) + + def __str__(self): + return self.user.get_full_name() or self.user.username + + def get_absolute_url(self): + return reverse('profile') diff --git a/accounts/signals.py b/accounts/signals.py new file mode 100644 index 0000000..ed9d24b --- /dev/null +++ b/accounts/signals.py @@ -0,0 +1,35 @@ +from django.contrib import messages +#from django.contrib.auth.models import User +from django.contrib.auth.signals import user_logged_in, user_logged_out +#from django.contrib.sites.shortcuts import get_current_site +from django.db.models.signals import post_save +from django.dispatch import receiver +from django.utils.translation import ugettext_lazy as _ +#from django.utils.translation import ugettext_noop + +from ponyconf.decorators import disable_for_loaddata + +from .models import User, Profile + + +@receiver(user_logged_in) +def on_user_logged_in(sender, request, user, **kwargs): + #participation, created = Participation.objects.get_or_create(user=user, site=get_current_site(request)) + #if user.is_superuser: + # participation.orga = True + # participation.save() + #if created: + # messages.info(request, "Please check your profile!\n", fail_silently=True) # FIXME + messages.success(request, _('Welcome!'), fail_silently=True) # FIXME + + +@receiver(user_logged_out) +def on_user_logged_out(sender, request, **kwargs): + messages.success(request, _('Goodbye!'), fail_silently=True) # FIXME + + +@receiver(post_save, sender=User, weak=False, dispatch_uid='create_profile') +@disable_for_loaddata +def create_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) diff --git a/accounts/templates/accounts/profile.html b/accounts/templates/accounts/profile.html new file mode 100644 index 0000000..c1ae638 --- /dev/null +++ b/accounts/templates/accounts/profile.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} + +{% load bootstrap3 i18n %} + +{% block profiletab %} class="active"{% endblock %} + + +{% block content %} + +