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))