# -*- coding: utf-8 -*- import pytz from django.db import models from django.db.models.signals import pre_save from django.contrib.auth.models import User from django_countries.fields import CountryField from .fields import PGPKeyField from main.utils import make_choice, set_created_field class UserProfile(models.Model): notify = models.BooleanField( "Send notifications", default=True, help_text="When enabled, send user 'flag out-of-date' notifications") time_zone = models.CharField( max_length=100, choices=make_choice(pytz.common_timezones), default="UTC", help_text="Used for developer clock page") alias = models.CharField( max_length=50, help_text="Required field") public_email = models.CharField( max_length=50, help_text="Required field") other_contact = models.CharField(max_length=100, null=True, blank=True) pgp_key = PGPKeyField(max_length=40, null=True, blank=True, verbose_name="PGP key fingerprint", help_text="consists of 40 hex digits; use `gpg --fingerprint`") website = models.CharField(max_length=200, null=True, blank=True) yob = models.IntegerField("Year of birth", null=True, blank=True) country = CountryField(blank=True) location = models.CharField(max_length=50, null=True, blank=True) languages = models.CharField(max_length=50, null=True, blank=True) interests = models.CharField(max_length=255, null=True, blank=True) occupation = models.CharField(max_length=50, null=True, blank=True) roles = models.CharField(max_length=255, null=True, blank=True) favorite_distros = models.CharField(max_length=255, null=True, blank=True) picture = models.FileField(upload_to='devs', default='devs/silhouette.png', help_text="Ideally 125px by 125px") user = models.OneToOneField(User, related_name='userprofile') allowed_repos = models.ManyToManyField('main.Repo', blank=True) latin_name = models.CharField(max_length=255, null=True, blank=True, help_text="Latin-form name; used only for non-Latin full names") last_modified = models.DateTimeField(editable=False) class Meta: db_table = 'user_profiles' get_latest_by = 'last_modified' verbose_name = 'additional profile data' verbose_name_plural = 'additional profile data' def get_absolute_url(self): # TODO: this is disgusting. find a way to consolidate this logic with # public.views.userlist among other places, and make some constants or # something so we aren't using copies of string names everywhere. group_names = self.user.groups.values_list('name', flat=True) if "Developers" in group_names: prefix = "developers" elif "Trusted Users" in group_names: prefix = "trustedusers" else: prefix = "fellows" return '/%s/#%s' % (prefix, self.user.username) class MasterKey(models.Model): owner = models.ForeignKey(User, related_name='masterkey_owner', help_text="The developer holding this master key") revoker = models.ForeignKey(User, related_name='masterkey_revoker', help_text="The developer holding the revocation certificate") pgp_key = PGPKeyField(max_length=40, verbose_name="PGP key fingerprint", help_text="consists of 40 hex digits; use `gpg --fingerprint`") created = models.DateField() revoked = models.DateField(null=True, blank=True) class Meta: ordering = ('created',) get_latest_by = 'created' def __unicode__(self): return u'%s, created %s' % ( self.owner.get_full_name(), self.created) class DeveloperKey(models.Model): owner = models.ForeignKey(User, related_name='all_keys', null=True, help_text="The developer this key belongs to") key = PGPKeyField(max_length=40, verbose_name="PGP key fingerprint", unique=True) created = models.DateTimeField() expires = models.DateTimeField(null=True, blank=True) revoked = models.DateTimeField(null=True, blank=True) parent = models.ForeignKey('self', null=True, on_delete=models.SET_NULL) def __unicode__(self): return self.key class PGPSignature(models.Model): signer = PGPKeyField(max_length=40, verbose_name="Signer key fingerprint", db_index=True) signee = PGPKeyField(max_length=40, verbose_name="Signee key fingerprint", db_index=True) created = models.DateField() expires = models.DateField(null=True, blank=True) revoked = models.DateField(null=True, blank=True) class Meta: ordering = ('signer', 'signee') get_latest_by = 'created' verbose_name = 'PGP signature' def __unicode__(self): return u'%s → %s' % (self.signer, self.signee) pre_save.connect(set_created_field, sender=UserProfile, dispatch_uid="devel.models") # vim: set ts=4 sw=4 et: