Pastebin Search

models.py

Tue May 05 2020
"""Moduł zawierający modle reprezentujące Słowniki."""

from django.db import models
from django.db.models import Q


class Dictionary(models.Model):
    """Model przechowujący wykaz Słowników zamkniętych/otwartych."""

    name = models.CharField('nazwa', max_length=1024)
    indication = models.CharField('oznaczenie', max_length=32, unique=True)

    def __str__(self):
        return f'{self.name} ({self.indication})'

    class Meta:
        verbose_name = 'słownik'
        verbose_name_plural = 'słowniki'


class ExtendedDictionaryItemValidityPeriodManager(models.Manager):
    """Menadżer zawierający dodatkowe metody ułatwiające operowanie na wartościach Słowników."""

    def available_at(self, time_point):
        """Zwraca wartości dostepne w określonym punkcie czasu.

        :param time_point: punkt czasowy
        :type time_point: datetime.datetime
        :rtype: django.db.models.query.QuerySet
        """
        return self.get_queryset().filter(
            Q(entry_date__lte=time_point) & (Q(cancellation_date__gt=time_point) | Q(cancellation_date__isnull=True))
        )


class CurrentDictionaryItemManager(models.Manager):
    """Menadżer zwracający aktualne wartości Słownika."""

    def get_queryset(self):
        return super().get_queryset().filter(cancellation_date__isnull=True)


class DictionaryItemValidityPeriod(models.Model):
    """Model abstrakcyjny określający okres obowiązywania wartości Słownika."""

    entry_date = models.DateTimeField('data obowiązywania - od', auto_now_add=True)
    cancellation_date = models.DateTimeField('data obowiązywania - do', null=True, blank=True)

    objects = ExtendedDictionaryItemValidityPeriodManager()
    current = CurrentDictionaryItemManager()

    class Meta:
        abstract = True


class ClosedDictionaryItem(DictionaryItemValidityPeriod):
    """Model przechowujący wartości ze Słowników zamkniętych."""

    dictionary = models.ForeignKey(Dictionary, on_delete=models.CASCADE)
    value = models.TextField('wartość')

    def __str__(self):
        return f'{self.dictionary.name} - {self.value}'

    class Meta:
        verbose_name = 'wartość słownika zamkniętego'
        verbose_name_plural = 'wartości słowników zamkniętych'


class ExtendedOpenDictionaryItemManager(models.Manager):
    """Menadżer zawierający dodatkowe metody ułatwiające operowanie na wartościach Słowników otwartych."""

    def available_at(self, time_point):
        """Zwraca wartości dostepne w określonym punkcie czasu.

        :param time_point: punkt czasowy
        :type time_point: datetime.datetime
        :rtype: django.db.models.query.QuerySet
        """
        return self.get_queryset().filter(
            Q(rejected=False) & Q(entry_date__lte=time_point) & (Q(cancellation_date__gt=time_point) | Q(cancellation_date__isnull=True))
        )


class CurrentOpenDictionaryItemManager(models.Manager):
    """Menadżer zwracający aktualne wartości Słownika otwartego."""

    def get_queryset(self):
        return super().get_queryset().filter(entry_date__isnull=False, cancellation_date__isnull=True, rejected=False)


class OpenDictionaryItem(models.Model):
    """Model przechowujący wartości ze słowników otwartych."""

    dictionary = models.ForeignKey(Dictionary, on_delete=models.CASCADE)
    value = models.TextField('wartość')
    entry_date = models.DateTimeField('data obowiązywania - od', null=True, blank=True)
    cancellation_date = models.DateTimeField('data obowiązywania - do', null=True, blank=True)
    rejected = models.BooleanField('odrzucony')

    objects = ExtendedOpenDictionaryItemManager()
    current = CurrentOpenDictionaryItemManager()

    def __str__(self):
        return f'{self.dictionary.name} - {self.value}'

    class Meta:
        verbose_name = 'wartość słownika otwartego'
        verbose_name_plural = 'wartości słowników otwartych'


class ProjectEntity(DictionaryItemValidityPeriod):
    """Model słownika Podmiotów Projektu."""

    name = models.CharField('nazwa jednostki', max_length=1024)
    institutional_role = models.CharField('rola instytucjonalna w projekcie', max_length=256)
    street = models.CharField('ulica', max_length=256)
    house_no = models.CharField('numer lokalu', max_length=64)
    postal_code = models.CharField('kod pocztowy', max_length=6)
    post_office = models.CharField('miejscowość poczty', max_length=256)
    phone_no = models.CharField('numer telefonu', max_length=10)
    e_mail = models.EmailField()
    esp = models.CharField(verbose_name='ESP', max_length=255)
    preferred_communication_channel = models.CharField('preferowany dla instytucji kanał komunikacji', max_length=6)

    class Meta:
        verbose_name = 'podmiot projektu'
        verbose_name_plural = 'podmioty projektu'


class ProjectTeamMember(DictionaryItemValidityPeriod):
    """Model słownika Zespołu projektu."""

    last_name = models.CharField('nazwisko', max_length=128)
    first_name = models.CharField('imię', max_length=128)
    role = models.CharField('rola osobowa w projekcie', max_length=128)
    unit_name = models.CharField('nazwa jednostki', max_length=256)
    office_department = models.CharField('biuro/departament', max_length=256)
    function = models.CharField('funkcja w jednostce', max_length=256)
    phone_no = models.CharField('numer telefonu', max_length=10)
    e_mail = models.EmailField()
    esp = models.CharField('ESP', max_length=255)
    preferred_communication_channel = models.CharField('preferowany dla instytucji kanał komunikacji', max_length=6)

    class Meta:
        verbose_name = 'członek zespołu projektu'
        verbose_name_plural = 'członkowie zespołu projektu'


class WalletProgram(DictionaryItemValidityPeriod):
    """Model słownika Portfele/programy."""

    short_name = models.CharField('skrócona nazwa portfela PRM/portfela/programu', max_length=32)
    full_name = models.CharField('pełna nazwa portfela PRM/portfela/programu', max_length=128)

    class Meta:
        verbose_name = 'portfel/program'
        verbose_name_plural = 'portfele/programy'


class WalletProgramEntity(DictionaryItemValidityPeriod):
    """Model słownika Podmioty portfela/programu."""

    institutional_role = models.CharField('rola instytucjonalna w portfelu PRM/portfelu/programie', max_length=128)
    unit_name = models.CharField('nazwa jednostki', max_length=256)
    street = models.CharField('ulica', max_length=256)
    house_no = models.CharField('numer lokalu', max_length=64)
    postal_code = models.CharField('kod pocztowy', max_length=6)
    post_office = models.CharField('miejscowość poczty', max_length=256)
    phone_no = models.CharField('numer telefonu', max_length=10)
    e_mail = models.EmailField()
    esp = models.CharField(verbose_name='ESP', max_length=255)
    preferred_communication_channel = models.CharField('preferowany dla instytucji kanał komunikacji', max_length=6)

    class Meta:
        verbose_name = 'podmiot portfela/programu'
        verbose_name_plural = 'podmioty portfela/programu'


class WalletProgramTeamMember(DictionaryItemValidityPeriod):
    """Model słownika Zespołu portfela/programu."""

    role = models.CharField('rola osobowa w portfelu PRM/ portfelu/programie', max_length=128)
    last_name = models.CharField('nazwisko', max_length=128)
    first_name = models.CharField('imię', max_length=128)
    unit_name = models.CharField('nazwa jednostki', max_length=128)
    office_department = models.CharField('biuro/departament', max_length=256)
    function = models.CharField('funkcja w jednostce', max_length=256)
    phone_no = models.CharField('numer telefonu', max_length=10)
    e_mail = models.EmailField()
    esp = models.CharField(verbose_name='ESP', max_length=256)
    preferred_communication_channel = models.CharField('preferowany dla instytucji kanał komunikacji', max_length=6)

    class Meta:
        verbose_name = 'członek zespołu portfela/programu'
        verbose_name_plural = 'członkowie zespołu portfela/programu'


class SRDProject(DictionaryItemValidityPeriod):
    """Model słowników Projekty SOR."""

    name = models.CharField('nazwa projektu SOR', max_length=256)
    kind = models.CharField('typ projektu SOR', max_length=16)

    class Meta:
        verbose_name = 'projekt SOR'
        verbose_name_plural = 'projekty SOR'


class StrategieAndStrategicProgram(DictionaryItemValidityPeriod):
    """Model słownika Strategie i programy strategiczne."""

    name = models.CharField('nazwa strategii/programu', max_length=64)
    purpose = models.CharField('cel szczegółowy strategii/programu', max_length=64)
    area = models.CharField('obszar strategii', max_length=64)

    class Meta:
        verbose_name = 'strategia i program strategiczny'
        verbose_name_plural = 'strategie i programy strategiczne'


class OperationalProgram(DictionaryItemValidityPeriod):
    """Model słownika Programy operacyjne."""

    activities = models.CharField('działania/Poddziałania Programu Operacyjnego', max_length=1024)
    po = models.CharField('PO', max_length=8)
    priority_axis = models.CharField('oś priorytetowa', max_length=64)
    activity = models.CharField('działanie', max_length=256)
    sub_activity = models.CharField('poddziałanie', max_length=64, blank=True)

    class Meta:
        verbose_name = 'program operacyjny'
        verbose_name_plural = 'programy operacyjne'


class BudgetPart(DictionaryItemValidityPeriod):
    """Model słownika Części budżetowe."""

    part = models.CharField('część budżetowa', max_length=256)
    number = models.CharField('numer części budżetowej', max_length=5)
    name = models.CharField('nazwa części budżetowej', max_length=256)

    class Meta:
        verbose_name = 'część budżetowa'
        verbose_name_plural = 'części budżetowe'


class Risk(DictionaryItemValidityPeriod):
    """Model słownika Ryzyka."""

    name = models.CharField('nazwa ryzyka', max_length=256)
    category = models.CharField('kategoria ryzyka', max_length=128)

    class Meta:
        verbose_name = 'ryzyko'
        verbose_name_plural = 'ryzyka'


class ProjectOpinion(DictionaryItemValidityPeriod):
    """Model słownika Opiniowanie projektów."""

    project_name = models.CharField('nazwa projektu', max_length=256)
    wallet_program_name_abbreviation = models.CharField('skrócona nazwa portfela/programu', max_length=64)
    reviewing_path = models.CharField('ścieżka opiniowania projektu', max_length=128)
    report_opinion = models.CharField('opiniowane raporty formularzowe/zestawy danych', max_length=128)
    phase = models.CharField('faza opiniowania', max_length=128)
    presentation_date = models.DateField('data prezentowania danych opiniowanego projektu')
    recipients = models.CharField('lista adresatów', max_length=128)

    class Meta:
        verbose_name = 'opiniowanie projektu'
        verbose_name_plural = 'opiniowanie projektów'