from annoying.functions import get_object_or_None from datetime import datetime from django.contrib.auth.models import User from django.db import models from itertools import chain from snipts.models import Snipt from teams.models import Team class UserProfile(models.Model): LIST_VIEW_CHOICES = (("N", "Normal"), ("C", "Compact")) EDITOR_CHOICES = (("C", "CodeMirror"), ("T", "Textarea")) THEME_CHOICES = (("D", "Default"), ("A", "Pro Adams")) EDITOR_THEME_CHOICES = ( ("default", "Default"), ("ambiance", "Ambiance"), ("blackboard", "Blackboard"), ("cobalt", "Cobalt"), ("eclipse", "Eclipse"), ("elegant", "Elegant"), ("erlang-dark", "Erlang Dark"), ("lesser-dark", "Lesser Dark"), ("monokai", "Monokai"), ("neat", "Neat"), ("night", "Night"), ("rubyblue", "Ruby Blue"), ("solarized dark", "Solarized Dark"), ("solarized light", "Solarized Light"), ("twilight", "Twilight"), ("vibrant-ink", "Vibrant Ink"), ("xq-dark", "XQ Dark"), ) # User user = models.OneToOneField(User, on_delete=models.CASCADE) is_pro = models.BooleanField(default=False) teams_beta_seen = models.BooleanField(default=False) teams_beta_applied = models.BooleanField(default=False) pro_date = models.DateTimeField(blank=True, null=True) stripe_id = models.CharField(max_length=100, null=True, blank=True) list_view = models.CharField( max_length=1, null=False, blank=False, default="N", choices=LIST_VIEW_CHOICES ) # Blog blog_title = models.CharField(max_length=250, null=True, blank=True) blog_theme = models.CharField( max_length=1, null=False, blank=False, default="A", choices=THEME_CHOICES ) blog_domain = models.CharField(max_length=250, null=True, blank=True) # Editor default_editor = models.CharField( max_length=250, null=False, blank=False, default="C", choices=EDITOR_CHOICES ) editor_theme = models.CharField( max_length=250, null=False, blank=False, default="default", choices=EDITOR_THEME_CHOICES, ) def get_blog_posts(self): return Snipt.objects.filter(user=self.user, blog_post=True, public=True) def get_primary_blog_domain(self): if not self.blog_domain: return None else: return self.blog_domain.split(" ")[0] def get_user_profile_url(self): # If the user has a blog domain, use that. if self.blog_domain: url = "http://{}".format(self.get_primary_blog_domain()) # Otherwise, if they have blog posts, use their Snipt blog URL. elif self.get_blog_posts(): url = 'https://{}.snipt.net/'.format(self.user.username) # Otherwise, use their regular Snipt profile page. else: url = 'https://snipt.net/{}/'.format(self.user.username) return url def has_public_snipts(self): return ( True if Snipt.objects.filter(user=self, public=True).count() > 0 else False ) @property def is_a_team(self): if get_object_or_None(Team, user=self.user, disabled=False): return True else: return False def teams(self): teams_owned = Team.objects.filter(owner=self.user, disabled=False) teams_in = Team.objects.filter(members=self.user, disabled=False) return list(chain(teams_owned, teams_in)) @property def has_teams(self): if len(self.teams()) > 0: return True else: return False def get_account_age(self): delta = datetime.now().replace(tzinfo=None) - self.user.date_joined.replace( tzinfo=None ) return delta.days User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])