Files
outbo-2-stgclone/evg-outbo-api/outbo/apps/photobriefing/models/brief.py
T
2024-11-27 13:18:16 +01:00

108 lines
3.6 KiB
Python
Executable File

from itertools import product
from django.db import models
from django.utils.translation import gettext_lazy as _
from django_fsm import FSMField, transition
from rules.contrib.models import RulesModel
from outbo.apps.activity_log.enums import MessageType
from outbo.apps.activity_log.models import ProductLogItem
from outbo.apps.core.models import TimestampableDeletableMixin
from outbo.apps.core.utils import get_current_date, is_empty_set
from outbo.apps.final_photobriefing.models import FinalBrief
from outbo.apps.photobriefing import rules
from outbo.apps.photobriefing.enums import ChoiceRole
class Brief(TimestampableDeletableMixin, RulesModel):
class Meta:
rules_permissions = {
"add": rules.can_create_brief,
"view": rules.can_read_brief,
"change": rules.can_update_brief,
"delete": rules.can_delete_brief,
}
product = models.OneToOneField(
verbose_name=_("product"),
to="products.Product",
on_delete=models.CASCADE,
primary_key=True,
editable=False,
related_name="photo_brief",
related_query_name="photo_brief",
)
session_date = models.DateField(
verbose_name=_("photo session date"),
blank=False,
null=False,
default=get_current_date,
)
concept_description = models.TextField(blank=True, null=False)
stage = FSMField(default="created", protected=True)
def save(self, *args, **kwargs):
result = super().save(*args, **kwargs)
if self.product:
self.product.save()
return result
def acceptable_for_user(self, *, user):
if user.is_observer or user.is_trader:
return False
return not user.is_agency and self.stage == "published"
def publishable_for_user(self, *, user):
if user.is_observer or user.is_trader:
return False
all_categories = set(self.items.values_list("category", flat=True))
if self.editable_for_user(user=user) and not is_empty_set(all_categories):
return True
return False
def completable_for_user(self, *, user):
if user.is_observer or user.is_trader:
return False
if not user.is_agency or self.stage != "published":
return False
roles = [ChoiceRole.SUPPLIER, ChoiceRole.CLIENT]
all_categories = set(self.items.values_list("category", flat=True))
if is_empty_set(all_categories):
return False
for category, role in product(all_categories, roles):
if not self.choices.filter(category_id=category, role=role).exists():
return False
return True
def editable_for_user(self, *, user):
if user.is_observer or user.is_trader:
return False
if not user.is_agency or not self.stage == "created":
return False
return self.product.stage.group in [2, 3]
@transition(field="stage", source="created", target="published")
def publish_as_user(self, *, user):
ProductLogItem.objects.create(
product=self.product,
created_by=user,
message="Photobriefing published",
message_type=MessageType.SUCCESS,
)
@transition(field="stage", source="published", target="completed")
def complete_as_user(self, *, user):
FinalBrief.objects.create(brief=self)
ProductLogItem.objects.create(
product=self.product,
created_by=user,
message="Photobriefing completed",
message_type=MessageType.SUCCESS,
)