Skip to content
Snippets Groups Projects
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")