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'