diff --git a/home/templates/home/index.html b/home/templates/home/index.html index e3685e4..c8148e5 100644 --- a/home/templates/home/index.html +++ b/home/templates/home/index.html @@ -23,6 +23,9 @@
  • {{ user.email }}
  • + {% for profile in user.profiles.all %}
  • + {{ profile.name }} +
  • {% endfor %} diff --git a/users/__init__.py b/users/__init__.py index e69de29..208620c 100644 --- a/users/__init__.py +++ b/users/__init__.py @@ -0,0 +1 @@ +default_app_config = 'users.apps.UsersConfig' diff --git a/users/admin.py b/users/admin.py index a4aaa84..1531810 100644 --- a/users/admin.py +++ b/users/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin -from .models import Key, User +from .models import Key, Profile, Site, User class KeyInline(admin.TabularInline): @@ -8,13 +8,20 @@ class KeyInline(admin.TabularInline): extra = 1 +class ProfileInline(admin.TabularInline): + model = Profile + extra = 1 + + class UserAdmin(BaseUserAdmin): fieldsets = BaseUserAdmin.fieldsets + ( ('Profile', {'fields': ('avatar', 'note')}), ) inlines = ( KeyInline, + ProfileInline, ) +admin.site.register(Site) admin.site.register(User, UserAdmin) diff --git a/users/apps.py b/users/apps.py index 4ce1fab..54e430e 100644 --- a/users/apps.py +++ b/users/apps.py @@ -3,3 +3,4 @@ from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' + verbose_name = 'Users and Profiles' diff --git a/users/migrations/0004_auto_20171023_0143.py b/users/migrations/0004_auto_20171023_0143.py new file mode 100644 index 0000000..6290295 --- /dev/null +++ b/users/migrations/0004_auto_20171023_0143.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-23 01:43 +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', '0003_key'), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('username', models.CharField(max_length=100)), + ('display_name', models.CharField(blank=True, max_length=100)), + ], + options={ + 'ordering': ('site', 'username'), + }, + ), + migrations.CreateModel( + name='Site', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100, unique=True)), + ('icon', models.CharField(max_length=100)), + ('url', models.CharField(max_length=100)), + ], + options={ + 'ordering': ('name',), + }, + ), + migrations.AddField( + model_name='profile', + name='site', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Site'), + ), + migrations.AddField( + model_name='profile', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='user', + name='profiles', + field=models.ManyToManyField(through='users.Profile', to='users.Site'), + ), + ] diff --git a/users/migrations/0005_auto_20171023_0158.py b/users/migrations/0005_auto_20171023_0158.py new file mode 100644 index 0000000..4f95d75 --- /dev/null +++ b/users/migrations/0005_auto_20171023_0158.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-23 01:58 +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', '0004_auto_20171023_0143'), + ] + + operations = [ + migrations.RemoveField( + model_name='user', + name='profiles', + ), + migrations.AlterField( + model_name='profile', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='profiles', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/users/models.py b/users/models.py index fcfadec..4aa73f6 100644 --- a/users/models.py +++ b/users/models.py @@ -6,11 +6,48 @@ def avatar_path(instance, name): return 'avatars/{id}/{name}'.format(id=instance.id, name=name) +class Site(models.Model): + name = models.CharField(max_length=100, unique=True) + icon = models.CharField(max_length=100) + url = models.CharField(max_length=100) + + def __str__(self): + return self.name + + class Meta: + ordering = ('name',) + + class User(AbstractUser): avatar = models.ImageField(upload_to=avatar_path) note = models.TextField(blank=True) +class Profile(models.Model): + user = models.ForeignKey( + User, + related_name='profiles', + on_delete=models.CASCADE + ) + site = models.ForeignKey(Site, on_delete=models.CASCADE) + username = models.CharField(max_length=100) + display_name = models.CharField(max_length=100, blank=True) + + def __str__(self): + return '{name}@{site}'.format(name=self.username, site=self.site) + + @property + def name(self): + return self.display_name or self.username + + @property + def url(self): + return self.site.url.format(username=self.username) + + class Meta: + ordering = ('site', 'username') + + class Key(models.Model): user = models.ForeignKey( User, @@ -20,5 +57,11 @@ class Key(models.Model): fingerprint = models.CharField(max_length=40) file = models.FileField(upload_to='keys') + @property + def key_id(self): return self.fingerprint[32:] + + def __str__(self): + return self.key_id + def pretty_print(self): return " ".join(self.fingerprint[i:i+4] for i in range(0, 40, 4))