class Interest(UUIDModel, HistoricalModel): title = LocalizedCharField() description = LocalizedTextField(blank=True, null=True, required=False) category = models.ForeignKey(InterestCategory, related_name="interests", on_delete=models.PROTECT) archived = models.BooleanField(default=False)
class Permission(SlugModel): name = LocalizedCharField(_("permission name"), blank=False, null=False, required=False) description = LocalizedTextField(_("permission description"), null=True, blank=True, required=False)
class Email(UUIDModel, HistoricalModel): identity = models.ForeignKey(Identity, related_name="additional_emails", on_delete=models.CASCADE) email = models.EmailField() description = LocalizedCharField(blank=True, null=True, required=False) class Meta: unique_together = [["identity", "email"]]
class Category(SlugModel): name = LocalizedCharField( _("category name"), blank=False, null=False, required=False ) description = LocalizedTextField( _("category description"), null=True, blank=True, required=False ) color = models.CharField( max_length=18, default="#FFFFFF", validators=[color_validator], )
class OnlyLocalizedName(models.Model): class Meta: abstract = True name = LocalizedCharField(max_length=512, required=False, verbose_name=_("name")) def __str__(self): return str(self.name)
class PhoneNumber(UUIDModel, HistoricalModel): identity = models.ForeignKey(Identity, related_name="phone_numbers", on_delete=models.CASCADE) phone = PhoneNumberField() description = LocalizedCharField(blank=True, null=True, required=False) default = UniqueBooleanField(default=False, together=["identity"]) class Meta: unique_together = [["identity", "phone"]] ordering = ("-default", )
class Material(LocalizedModel): objects = MaterialQuerySet.as_manager() class Meta: ordering = ['-highlight', '-timestamp'] verbose_name = _("Material") verbose_name_plural = _("Materials") title = LocalizedCharField(blank=False, null=False, required=False, max_length=512, verbose_name=_("title")) slug = LocalizedUniqueSlugField(populate_from='title') timestamp = models.DateTimeField(auto_now_add=True, verbose_name=_("creation timestamp")) highlight = models.BooleanField(default=False, verbose_name=_("highlighted on search")) subjects = models.ManyToManyField(Subject, verbose_name=_("subject")) goal = LocalizedTextField(blank=True, null=True, required=False, verbose_name=_("goal")) brief = LocalizedTextField(blank=False, null=False, required=False, verbose_name=_("brief")) author = models.CharField(max_length=512, blank=True, verbose_name=_("author")) def __str__(self): return str(self.title) @property def brief_rendered(self): return markdownify(str(self.brief)) @property def goal_rendered(self): return markdownify(str(self.goal)) def get_related(self): for related in ['activity', 'reading', 'video', 'link']: if hasattr(self, related): return getattr(self, related) def get_model_name(self): return self.get_related()._meta.model_name def get_absolute_url(self): return self.get_related().get_absolute_url()
class Role(SlugModel): name = LocalizedCharField(_("role name"), blank=False, null=False, required=False) description = LocalizedTextField(_("role description"), null=True, blank=True, required=False) permissions = models.ManyToManyField("Permission", related_name="roles") class Meta: ordering = ["slug"]
class Document(UUIDModel): title = LocalizedCharField( _("document title"), blank=True, null=True, required=False ) description = LocalizedTextField( _("document description"), null=True, blank=True, required=False ) category = models.ForeignKey( Category, on_delete=models.SET_NULL, null=True, blank=True, related_name="documents", ) tags = models.ManyToManyField(Tag, blank=True, related_name="documents")
class Address(UUIDModel, HistoricalModel): identity = models.ForeignKey(Identity, related_name="addresses", on_delete=models.CASCADE) address_addition = models.CharField(max_length=255, null=True, blank=True) street_and_number = models.CharField(max_length=255) po_box = models.CharField(max_length=255, null=True, blank=True) postcode = models.CharField(max_length=255) town = models.CharField(max_length=255) country = CountryField(default="CH") description = LocalizedCharField(blank=True, null=True, required=False) default = UniqueBooleanField(default=False, together=["identity"]) class Meta: ordering = ("-default", )
class Scope(MPTTModel, UUIDModel): name = LocalizedCharField(_("scope name"), blank=False, null=False, required=False) description = LocalizedTextField(_("scope description"), null=True, blank=True, required=False) parent = TreeForeignKey( "self", on_delete=models.SET_NULL, null=True, blank=True, related_name="children", )
class User(UUIDModel): username_validator = UnicodeUsernameValidator() username = models.CharField( _("username"), max_length=255, unique=True, help_text= _("Required. 255 characters or fewer. Letters, digits and @/./+/-/_ only." ), validators=[username_validator], error_messages={ "unique": _("A user with that username already exists.") }, ) first_name = models.CharField(_("first name"), max_length=255, blank=True, null=True) last_name = models.CharField(_("last name"), max_length=255, blank=True, null=True) email = models.EmailField(_("email address"), blank=True, null=True) phone = models.CharField(_("phone"), max_length=100, blank=True, null=True) language = models.CharField(_("language"), max_length=2, default=get_language_code) address = models.CharField(_("address"), max_length=255, blank=True, null=True) city = LocalizedCharField(_("city"), max_length=255, blank=True, null=True) zip = models.CharField(_("zip"), max_length=10, blank=True, null=True) is_active = models.BooleanField( _("active"), default=True, help_text=_( "Designates whether this user should be treated as active."), ) date_joined = models.DateTimeField(_("date joined"), default=timezone.now) EMAIL_FIELD = "email" USERNAME_FIELD = "username" REQUIRED_FIELDS = ["email"] def __str__(self): return "%s object (%s - %s)" % (self.__class__.__name__, self.pk, self.username) class Meta: verbose_name = _("user") verbose_name_plural = _("users") def clean(self): super().clean() setattr(self, self.USERNAME_FIELD, self.normalize_username(self.get_username())) self.email = BaseUserManager.normalize_email(self.email) def get_full_name(self): """Return the first_name plus the last_name, with a space in between.""" full_name = "%s %s" % (self.first_name, self.last_name) return full_name.strip() def get_username(self): """Return the username for this User.""" return getattr(self, self.USERNAME_FIELD) def natural_key(self): return self.get_username() @classmethod def get_email_field_name(cls): return "email" @classmethod def normalize_username(cls, username): return (unicodedata.normalize("NFKC", username) if isinstance( username, str) else username) @property def is_anonymous(self): """ Return False. This is a way of comparing User objects to anonymous users. """ return False @property def is_authenticated(self): """ Return True. This is a way to tell if the user has been authenticated in templates. """ return True
class Tag(SlugModel): name = LocalizedCharField(_("tag name"), blank=False, null=False, required=False) description = LocalizedTextField( _("tag description"), null=True, blank=True, required=False )
class InterestCategory(UUIDModel, HistoricalModel): title = LocalizedCharField() description = LocalizedTextField(blank=True, null=True, required=False) archived = models.BooleanField(default=False)
class Snippet(UUIDModel, HistoricalModel): title = LocalizedCharField(blank=False, null=False, required=False) body = LocalizedTextField(blank=False, null=False, required=False) archived = models.BooleanField(default=False)