models.py 5.02 KiB
from django.db import models
from django.utils.text import slugify
from django.utils.translation import gettext as _
from jsonstore import fields
import uuid
from aleksis.core.mixins import ExtensibleModel
from aleksis.core.models import Person
class AbiPerson(ExtensibleModel):
name = models.CharField(max_length=255, verbose_name=_("Name"))
person = models.ForeignKey(
to=Person,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_("AlekSIS person"),
related_name="abi_persons",
)
class Meta:
verbose_name = _("Person (Abi)")
verbose_name_plural = _("Persons (Abi)")
class AbiGroup(ExtensibleModel):
name = models.CharField(max_length=255, verbose_name=_("Name"))
members = models.ManyToManyField(
to=AbiPerson,
verbose_name=_("Group members"),
related_name="member_of",
null=True,
blank=True,
)
class Meta:
verbose_name = _("Group (Abi)")
verbose_name_plural = _("Groups (Abi)")
class Profile(ExtensibleModel):
fields = {}
person = models.OneToOneField(
to=AbiPerson, on_delete=models.CASCADE, verbose_name=_("Person"), related_name="profile"
)
nickname = models.CharField(max_length=255, blank=True, verbose_name=_("Nickname"))
current_picture = models.ImageField(
null=True, blank=True, upload_to="abi/current/", verbose_name=_("Current picture")
)
old_picture = models.ImageField(
null=True, blank=True, upload_to="abi/old/", verbose_name=_("Picture from the childhood")
)
class Meta:
verbose_name = _("Personal profile")
verbose_name_plural = _("Personal profiles")
class AdditionalProfileField(ExtensibleModel):
name = models.CharField(max_length=255)
field_name_field = models.UUIDField(editable=False, default=uuid.uuid4())
@property
def field_name(self):
return "abi_" + slugify(self.field_name_field).replace("-", "_")
def __str__(self):
return self.name
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
from .model_extensions import update_profile_fields # noqa
update_profile_fields()
class RankingCategory(ExtensibleModel):
name = models.CharField(max_length=255, verbose_name=_("Name"))
group = models.ForeignKey(
to=AbiGroup,
on_delete=models.CASCADE,
verbose_name=_("Group"),
help_text=_("The persons in this group will be selectable for rankings in this category."),
related_name="ranking_categories",
)
number_of_persons = models.PositiveIntegerField(
default=1, verbose_name=_("Number of selectable persons")
)
class Meta:
verbose_name = _("Ranking category")
verbose_name_plural = _("Ranking categories")
class Ranking(ExtensibleModel):
category = models.ForeignKey(
to=RankingCategory,
on_delete=models.CASCADE,
verbose_name=_("Ranking category"),
related_name="rankings",
)
person = models.ForeignKey(
to=AbiPerson,
on_delete=models.CASCADE,
related_name="rankings",
verbose_name=_("Ranked persons"),
)
weight = models.PositiveIntegerField(default=1, verbose_name=_("Weight of this ranking"))
ranked_by = models.ForeignKey(
to=AbiPerson,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("Ranked by"),
related_name="done_rankings",
)
# FIXME Validate number of persons
# FIXME Validate Weight
class Meta:
verbose_name = _("Ranking")
verbose_name_plural = _("Rankings")
class Comment(ExtensibleModel):
person = models.ForeignKey(
to=AbiPerson,
on_delete=models.CASCADE,
verbose_name=_("Receiver"),
related_name="received_comments",
)
author = models.ForeignKey(
to=AbiPerson,
on_delete=models.CASCADE,
verbose_name=_("Author"),
related_name="written_comments",
)
text = models.TextField(blank=True, verbose_name=_("Comment"))
requested = models.BooleanField(default=False, verbose_name=_("Requested"))
class Meta:
verbose_name = _("Comment")
verbose_name_plural = _("Comments")
class Quote(ExtensibleModel):
authors = models.ManyToManyField(
to=AbiPerson,
verbose_name=_("Author(s)"),
help_text=_(
"This can be left empty if the author is unknown or if there is no specific author."
),
blank=True,
null=True,
related_name="quotes",
)
text = models.TextField(
verbose_name=_("Quote"),
help_text=_("You also can include any extra information here like a context if you want."),
)
submitted_by = models.ForeignKey(
to=AbiPerson,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_("Submitted by"),
related_name="submitted_quotes",
)
class Meta:
verbose_name = _("Quote")
verbose_name_plural = _("Quotes")