48 lines
1.8 KiB
Python
48 lines
1.8 KiB
Python
# backend/modules/task_management/services.py
|
|
|
|
from .models import Task
|
|
from rest_framework.exceptions import ValidationError
|
|
from django.core.exceptions import ValidationError as DjangoValidationError
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class TaskService:
|
|
@staticmethod
|
|
def create_task_entry(data: dict, user=None) -> Task:
|
|
"""
|
|
Univerzalna metoda: prihvaća podatke i opcionalnog korisnika.
|
|
"""
|
|
# Poslovna pravila
|
|
if data.get('status') == 'DONE' and (user and not user.is_staff):
|
|
raise ValidationError({"status": "Samo admini mogu odmah označiti zadatak kao gotov."})
|
|
|
|
payload = dict(data)
|
|
if user and 'assigned_to' not in payload:
|
|
payload['assigned_to'] = user
|
|
|
|
entry = Task(**payload)
|
|
try:
|
|
entry.full_clean()
|
|
except DjangoValidationError as exc:
|
|
logger.error(f"Neuspješna validacija zadatka: {exc}")
|
|
raise ValidationError(exc.message_dict if hasattr(exc, 'message_dict') else exc.messages)
|
|
entry.save()
|
|
logger.info(f"Zadatak uspješno kreiran: {entry.id}")
|
|
return entry
|
|
|
|
@staticmethod
|
|
def update_task_entry(instance, data, user):
|
|
# Validacija za update (npr. samo vlasnik ili admin smije ažurirati)
|
|
if not user.is_staff and instance.assigned_to != user:
|
|
raise ValidationError("Nemate dozvolu za izmjenu ovog zadatka.")
|
|
|
|
# Spremanje
|
|
for attr, value in data.items():
|
|
setattr(instance, attr, value)
|
|
try:
|
|
instance.full_clean()
|
|
except DjangoValidationError as exc:
|
|
raise ValidationError(exc.message_dict if hasattr(exc, 'message_dict') else exc.messages)
|
|
instance.save()
|
|
return instance |