Run Black over the whole codebase

This commit is contained in:
Danielle McLean 2023-08-10 16:52:37 +10:00
parent cd990e4e2f
commit 2e7d12b3e6
Signed by: 00dani
GPG key ID: 52C059C3B22A753E
109 changed files with 1539 additions and 1209 deletions

View file

@ -4,7 +4,7 @@ from .models import PgpKey, Profile, Site, User
class SiteAdmin(admin.ModelAdmin):
list_display = ('name', 'icon', 'domain', 'url_template')
list_display = ("name", "icon", "domain", "url_template")
class PgpKeyInline(admin.TabularInline):
@ -19,7 +19,7 @@ class ProfileInline(admin.TabularInline):
class UserAdmin(BaseUserAdmin):
fieldsets = BaseUserAdmin.fieldsets + (
('Profile', {'fields': ('avatar', 'xmpp', 'note')}),
("Profile", {"fields": ("avatar", "xmpp", "note")}),
)
inlines = (
PgpKeyInline,

View file

@ -2,5 +2,5 @@ from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
verbose_name = 'Users and Profiles'
name = "users"
verbose_name = "Users and Profiles"

View file

@ -9,40 +9,127 @@ import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0008_alter_user_username_max_length'),
("auth", "0008_alter_user_username_max_length"),
]
operations = [
migrations.CreateModel(
name='User',
name="User",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('avatar', models.ImageField(upload_to='')),
('note', models.TextField(blank=True)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("password", models.CharField(max_length=128, verbose_name="password")),
(
"last_login",
models.DateTimeField(
blank=True, null=True, verbose_name="last login"
),
),
(
"is_superuser",
models.BooleanField(
default=False,
help_text="Designates that this user has all permissions without explicitly assigning them.",
verbose_name="superuser status",
),
),
(
"username",
models.CharField(
error_messages={
"unique": "A user with that username already exists."
},
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
max_length=150,
unique=True,
validators=[
django.contrib.auth.validators.UnicodeUsernameValidator()
],
verbose_name="username",
),
),
(
"first_name",
models.CharField(
blank=True, max_length=30, verbose_name="first name"
),
),
(
"last_name",
models.CharField(
blank=True, max_length=30, verbose_name="last name"
),
),
(
"email",
models.EmailField(
blank=True, max_length=254, verbose_name="email address"
),
),
(
"is_staff",
models.BooleanField(
default=False,
help_text="Designates whether the user can log into this admin site.",
verbose_name="staff status",
),
),
(
"is_active",
models.BooleanField(
default=True,
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
verbose_name="active",
),
),
(
"date_joined",
models.DateTimeField(
default=django.utils.timezone.now, verbose_name="date joined"
),
),
("avatar", models.ImageField(upload_to="")),
("note", models.TextField(blank=True)),
(
"groups",
models.ManyToManyField(
blank=True,
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
related_name="user_set",
related_query_name="user",
to="auth.Group",
verbose_name="groups",
),
),
(
"user_permissions",
models.ManyToManyField(
blank=True,
help_text="Specific permissions for this user.",
related_name="user_set",
related_query_name="user",
to="auth.Permission",
verbose_name="user permissions",
),
),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
"verbose_name": "user",
"verbose_name_plural": "users",
"abstract": False,
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
("objects", django.contrib.auth.models.UserManager()),
],
),
]

View file

@ -7,15 +7,14 @@ import users.models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
("users", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name='user',
name='avatar',
model_name="user",
name="avatar",
field=models.ImageField(upload_to=users.models.avatar_path),
),
]

View file

@ -8,19 +8,33 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20171023_0109'),
("users", "0002_auto_20171023_0109"),
]
operations = [
migrations.CreateModel(
name='Key',
name="Key",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fingerprint', models.CharField(max_length=40)),
('file', models.FileField(upload_to='keys')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='keys', to=settings.AUTH_USER_MODEL)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("fingerprint", models.CharField(max_length=40)),
("file", models.FileField(upload_to="keys")),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="keys",
to=settings.AUTH_USER_MODEL,
),
),
],
),
]

View file

@ -8,48 +8,67 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0003_key'),
("users", "0003_key"),
]
operations = [
migrations.CreateModel(
name='Profile',
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)),
(
"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'),
"ordering": ("site", "username"),
},
),
migrations.CreateModel(
name='Site',
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)),
(
"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',),
"ordering": ("name",),
},
),
migrations.AddField(
model_name='profile',
name='site',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Site'),
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),
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'),
model_name="user",
name="profiles",
field=models.ManyToManyField(through="users.Profile", to="users.Site"),
),
]

View file

@ -8,19 +8,22 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0004_auto_20171023_0143'),
("users", "0004_auto_20171023_0143"),
]
operations = [
migrations.RemoveField(
model_name='user',
name='profiles',
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),
model_name="profile",
name="user",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="profiles",
to=settings.AUTH_USER_MODEL,
),
),
]

View file

@ -6,21 +6,20 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0005_auto_20171023_0158'),
("users", "0005_auto_20171023_0158"),
]
operations = [
migrations.RenameField(
model_name='site',
old_name='url',
new_name='url_template',
model_name="site",
old_name="url",
new_name="url_template",
),
migrations.AddField(
model_name='site',
name='domain',
field=models.CharField(default='', max_length=100),
model_name="site",
name="domain",
field=models.CharField(default="", max_length=100),
preserve_default=False,
),
]

View file

@ -6,15 +6,14 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0006_auto_20171031_1336'),
("users", "0006_auto_20171031_1336"),
]
operations = [
migrations.AlterField(
model_name='site',
name='domain',
model_name="site",
name="domain",
field=models.CharField(blank=True, max_length=100),
),
]

View file

@ -6,14 +6,13 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0007_auto_20171031_1347'),
("users", "0007_auto_20171031_1347"),
]
operations = [
migrations.AlterModelOptions(
name='site',
options={'ordering': ('domain',)},
name="site",
options={"ordering": ("domain",)},
),
]

View file

@ -6,15 +6,14 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0008_auto_20171031_1357'),
("users", "0008_auto_20171031_1357"),
]
operations = [
migrations.AddField(
model_name='user',
name='xmpp',
model_name="user",
name="xmpp",
field=models.EmailField(blank=True, max_length=254),
),
]

View file

@ -6,14 +6,13 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0009_user_xmpp'),
("users", "0009_user_xmpp"),
]
operations = [
migrations.AlterModelOptions(
name='site',
options={'ordering': ('name',)},
name="site",
options={"ordering": ("name",)},
),
]

View file

@ -6,15 +6,13 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0010_auto_20171206_2211'),
("users", "0010_auto_20171206_2211"),
]
operations = [
migrations.AlterModelManagers(
name='user',
managers=[
],
name="user",
managers=[],
),
]

View file

@ -7,16 +7,15 @@ import users.models
class Migration(migrations.Migration):
dependencies = [
('users', '0011_auto_20180124_1311'),
("users", "0011_auto_20180124_1311"),
]
operations = [
migrations.AlterModelManagers(
name='user',
name="user",
managers=[
('objects', users.models.UserManager()),
("objects", users.models.UserManager()),
],
),
]

View file

@ -5,20 +5,31 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0012_auto_20180129_1614'),
("users", "0012_auto_20180129_1614"),
]
operations = [
migrations.AddField(
model_name='user',
name='email_md5',
field=computed_property.fields.ComputedCharField(compute_from='calc_email_md5', default='', editable=False, max_length=32, unique=True),
model_name="user",
name="email_md5",
field=computed_property.fields.ComputedCharField(
compute_from="calc_email_md5",
default="",
editable=False,
max_length=32,
unique=True,
),
),
migrations.AddField(
model_name='user',
name='email_sha256',
field=computed_property.fields.ComputedCharField(compute_from='calc_email_sha256', default='', editable=False, max_length=64, unique=True),
model_name="user",
name="email_sha256",
field=computed_property.fields.ComputedCharField(
compute_from="calc_email_sha256",
default="",
editable=False,
max_length=64,
unique=True,
),
),
]

View file

@ -6,58 +6,79 @@ import users.models
class Migration(migrations.Migration):
dependencies = [
('users', '0013_auto_20180323_1200'),
("users", "0013_auto_20180323_1200"),
]
operations = [
migrations.AlterField(
model_name='profile',
name='display_name',
model_name="profile",
name="display_name",
field=models.CharField(
blank=True, help_text='overrides the username for display - useful for sites that use ugly IDs', max_length=100),
blank=True,
help_text="overrides the username for display - useful for sites that use ugly IDs",
max_length=100,
),
),
migrations.AlterField(
model_name='profile',
name='username',
model_name="profile",
name="username",
field=models.CharField(
help_text="the user's actual handle or ID on the remote site", max_length=100),
help_text="the user's actual handle or ID on the remote site",
max_length=100,
),
),
migrations.AlterField(
model_name='user',
name='avatar',
model_name="user",
name="avatar",
field=models.ImageField(
help_text='an avatar or photo that represents this user', upload_to=users.models.avatar_path),
help_text="an avatar or photo that represents this user",
upload_to=users.models.avatar_path,
),
),
migrations.AlterField(
model_name='user',
name='email_md5',
model_name="user",
name="email_md5",
field=computed_property.fields.ComputedCharField(
compute_from='calc_email_md5', editable=False, help_text="MD5 hash of the user's email, used for Libravatar", max_length=32, unique=True),
compute_from="calc_email_md5",
editable=False,
help_text="MD5 hash of the user's email, used for Libravatar",
max_length=32,
unique=True,
),
),
migrations.AlterField(
model_name='user',
name='email_sha256',
model_name="user",
name="email_sha256",
field=computed_property.fields.ComputedCharField(
compute_from='calc_email_sha256', editable=False, help_text="SHA-256 hash of the user's email, used for Libravatar", max_length=64, unique=True),
compute_from="calc_email_sha256",
editable=False,
help_text="SHA-256 hash of the user's email, used for Libravatar",
max_length=64,
unique=True,
),
),
migrations.AlterField(
model_name='user',
name='last_name',
model_name="user",
name="last_name",
field=models.CharField(
blank=True, max_length=150, verbose_name='last name'),
blank=True, max_length=150, verbose_name="last name"
),
),
migrations.AlterField(
model_name='user',
name='note',
model_name="user",
name="note",
field=models.TextField(
blank=True, help_text='a bio or short description provided by the user'),
blank=True, help_text="a bio or short description provided by the user"
),
),
migrations.AlterField(
model_name='user',
name='xmpp',
model_name="user",
name="xmpp",
field=models.EmailField(
blank=True, help_text='an XMPP address through which the user may be reached', max_length=254),
blank=True,
help_text="an XMPP address through which the user may be reached",
max_length=254,
),
),
]

View file

@ -5,17 +5,22 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0014_auto_20180711_1248'),
("users", "0014_auto_20180711_1248"),
]
operations = [
migrations.AddField(
model_name='user',
name='openid_sha256',
field=computed_property.fields.ComputedCharField(compute_from='calc_openid_sha256', default='', editable=False,
help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar", max_length=64, unique=True),
model_name="user",
name="openid_sha256",
field=computed_property.fields.ComputedCharField(
compute_from="calc_openid_sha256",
default="",
editable=False,
help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar",
max_length=64,
unique=True,
),
preserve_default=False,
),
]

View file

@ -4,19 +4,16 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0015_user_openid_sha256'),
("users", "0015_user_openid_sha256"),
]
operations = [
migrations.AlterField(
model_name='user',
name='first_name',
model_name="user",
name="first_name",
field=models.CharField(
blank=True,
max_length=150,
verbose_name='first name'
blank=True, max_length=150, verbose_name="first name"
),
),
]

View file

@ -4,14 +4,13 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('users', '0016_alter_user_first_name'),
("users", "0016_alter_user_first_name"),
]
operations = [
migrations.RenameModel(
old_name='Key',
new_name='PgpKey',
old_name="Key",
new_name="PgpKey",
),
]

View file

@ -10,7 +10,7 @@ from lemoncurry import utils
def avatar_path(instance, name):
return 'avatars/{id}/{name}'.format(id=instance.id, name=name)
return "avatars/{id}/{name}".format(id=instance.id, name=name)
class Site(models.Model):
@ -19,7 +19,7 @@ class Site(models.Model):
domain = models.CharField(max_length=100, blank=True)
url_template = models.CharField(max_length=100)
def format(self, username=''):
def format(self, username=""):
return self.url_template.format(domain=self.domain, username=username)
@property
@ -30,12 +30,14 @@ class Site(models.Model):
return self.name
class Meta:
ordering = ('name',)
ordering = ("name",)
class UserManager(DjangoUserManager):
def get_queryset(self):
return super(UserManager, self).get_queryset().prefetch_related('keys', 'profiles')
return (
super(UserManager, self).get_queryset().prefetch_related("keys", "profiles")
)
class User(ModelMeta, AbstractUser):
@ -44,52 +46,56 @@ class User(ModelMeta, AbstractUser):
generated based on all their associated information and may author as many
h-entries (:model:`entries.Entry`) as they wish.
"""
objects = UserManager()
avatar = models.ImageField(
upload_to=avatar_path,
help_text='an avatar or photo that represents this user'
upload_to=avatar_path, help_text="an avatar or photo that represents this user"
)
note = models.TextField(
blank=True,
help_text='a bio or short description provided by the user'
blank=True, help_text="a bio or short description provided by the user"
)
xmpp = models.EmailField(
blank=True,
help_text='an XMPP address through which the user may be reached'
blank=True, help_text="an XMPP address through which the user may be reached"
)
# This is gonna need to change if I ever decide to add multiple-user support ;)
url = '/'
url = "/"
email_md5 = ComputedCharField(
compute_from='calc_email_md5', max_length=32, unique=True,
help_text="MD5 hash of the user's email, used for Libravatar"
compute_from="calc_email_md5",
max_length=32,
unique=True,
help_text="MD5 hash of the user's email, used for Libravatar",
)
email_sha256 = ComputedCharField(
compute_from='calc_email_sha256', max_length=64, unique=True,
help_text="SHA-256 hash of the user's email, used for Libravatar"
compute_from="calc_email_sha256",
max_length=64,
unique=True,
help_text="SHA-256 hash of the user's email, used for Libravatar",
)
openid_sha256 = ComputedCharField(
compute_from='calc_openid_sha256', max_length=64, unique=True,
help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar"
compute_from="calc_openid_sha256",
max_length=64,
unique=True,
help_text="SHA-256 hash of the user's OpenID URL, used for Libravatar",
)
@property
def calc_email_md5(self):
return md5(self.email.lower().encode('utf-8')).hexdigest()
return md5(self.email.lower().encode("utf-8")).hexdigest()
@property
def calc_email_sha256(self):
return sha256(self.email.lower().encode('utf-8')).hexdigest()
return sha256(self.email.lower().encode("utf-8")).hexdigest()
@property
def calc_openid_sha256(self):
return sha256(self.full_url.encode('utf-8')).hexdigest()
return sha256(self.full_url.encode("utf-8")).hexdigest()
@property
def name(self):
return '{0} {1}'.format(self.first_name, self.last_name)
return "{0} {1}".format(self.first_name, self.last_name)
def get_absolute_url(self):
return self.absolute_url
@ -100,7 +106,7 @@ class User(ModelMeta, AbstractUser):
@property
def full_url(self):
base = 'https://' + DjangoSite.objects.get_current().domain
base = "https://" + DjangoSite.objects.get_current().domain
return urljoin(base, self.url)
@property
@ -114,45 +120,45 @@ class User(ModelMeta, AbstractUser):
@cached_property
def facebook_id(self):
for p in self.profiles.all():
if p.site.name == 'Facebook':
if p.site.name == "Facebook":
return p.username
return None
@cached_property
def twitter_username(self):
for p in self.profiles.all():
if p.site.name == 'Twitter':
return '@' + p.username
if p.site.name == "Twitter":
return "@" + p.username
return None
@property
def json_ld(self):
base = 'https://' + DjangoSite.objects.get_current().domain
base = "https://" + DjangoSite.objects.get_current().domain
return {
'@context': 'http://schema.org',
'@type': 'Person',
'@id': self.full_url,
'url': self.full_url,
'name': self.name,
'email': self.email,
'image': urljoin(base, self.avatar.url),
'givenName': self.first_name,
'familyName': self.last_name,
'sameAs': [profile.url for profile in self.profiles.all()]
"@context": "http://schema.org",
"@type": "Person",
"@id": self.full_url,
"url": self.full_url,
"name": self.name,
"email": self.email,
"image": urljoin(base, self.avatar.url),
"givenName": self.first_name,
"familyName": self.last_name,
"sameAs": [profile.url for profile in self.profiles.all()],
}
_metadata = {
'image': 'avatar_url',
'description': 'description',
'og_type': 'profile',
'og_profile_id': 'facebook_id',
'twitter_creator': 'twitter_username',
"image": "avatar_url",
"description": "description",
"og_type": "profile",
"og_profile_id": "facebook_id",
"twitter_creator": "twitter_username",
}
class ProfileManager(models.Manager):
def get_queryset(self):
return super(ProfileManager, self).get_queryset().select_related('site')
return super(ProfileManager, self).get_queryset().select_related("site")
class Profile(models.Model):
@ -163,26 +169,22 @@ class Profile(models.Model):
representative h-card. Additionally, :model:`entries.Syndication` is
tracked by linking each syndication to a particular profile.
"""
objects = ProfileManager()
user = models.ForeignKey(
User,
related_name='profiles',
on_delete=models.CASCADE
)
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,
help_text="the user's actual handle or ID on the remote site"
max_length=100, help_text="the user's actual handle or ID on the remote site"
)
display_name = models.CharField(
max_length=100,
blank=True,
help_text="overrides the username for display - useful for sites that use ugly IDs"
help_text="overrides the username for display - useful for sites that use ugly IDs",
)
def __str__(self):
if self.site.domain:
return self.name + '@' + self.site.domain
return self.name + "@" + self.site.domain
return self.name
@property
@ -194,7 +196,7 @@ class Profile(models.Model):
return self.site.format(username=self.username)
class Meta:
ordering = ('site', 'username')
ordering = ("site", "username")
class PgpKey(models.Model):
@ -203,13 +205,10 @@ class PgpKey(models.Model):
key will be added to the user's h-card with rel="pgpkey", a format
compatible with IndieAuth.com.
"""
user = models.ForeignKey(
User,
related_name='keys',
on_delete=models.CASCADE
)
user = models.ForeignKey(User, related_name="keys", on_delete=models.CASCADE)
fingerprint = models.CharField(max_length=40)
file = models.FileField(upload_to='keys')
file = models.FileField(upload_to="keys")
@property
def key_id(self):
@ -231,4 +230,4 @@ class PgpKey(models.Model):
same way GnuPG does. This can make reading the fingerprint a little
friendlier.
"""
return " ".join(self.fingerprint[i:i+4] for i in range(0, 40, 4))
return " ".join(self.fingerprint[i : i + 4] for i in range(0, 40, 4))

View file

@ -2,7 +2,5 @@ from django.urls import re_path
from .views import libravatar
app_name = 'users'
urlpatterns = (
re_path('^avatar/(?P<hash>[a-z0-9]+)$', libravatar, name='libravatar'),
)
app_name = "users"
urlpatterns = (re_path("^avatar/(?P<hash>[a-z0-9]+)$", libravatar, name="libravatar"),)

View file

@ -8,16 +8,16 @@ from .models import User
def try_libravatar_org(hash, get):
url = 'https://seccdn.libravatar.org/avatar/' + hash
url = "https://seccdn.libravatar.org/avatar/" + hash
if get:
url += '?' + get.urlencode()
url += "?" + get.urlencode()
return HttpResponseRedirect(url)
@cache_page(60 * 15)
def libravatar(request, hash):
g = request.GET
size = g.get('s', g.get('size', 80))
size = g.get("s", g.get("size", 80))
try:
size = int(size)
except ValueError:
@ -30,7 +30,7 @@ def libravatar(request, hash):
elif len(hash) == 64:
where = Q(email_sha256=hash) | Q(openid_sha256=hash)
else:
return utils.bad_req('hash must be either md5 or sha256')
return utils.bad_req("hash must be either md5 or sha256")
# If the user doesn't exist or lacks an avatar, see if libravatar.org has
# one for them - libravatar.org falls back to Gravatar when possible (only
@ -51,6 +51,6 @@ def libravatar(request, hash):
im = im.crop((0, 0, natural_size, natural_size))
im = im.resize((size, size), resample=Image.HAMMING)
response = HttpResponse(content_type='image/'+image_type.lower())
response = HttpResponse(content_type="image/" + image_type.lower())
im.save(response, image_type)
return response