feat(projects): support members and align rate payloads
This commit is contained in:
@@ -1,16 +1,16 @@
|
||||
from rest_framework.exceptions import ValidationError
|
||||
from apps.projects.models import ProjectMembership
|
||||
|
||||
def add_project_member(project, user, role):
|
||||
def add_project_member(project, user_id, role):
|
||||
"""
|
||||
Adds a user to a project. Ensures no duplicate active memberships exist.
|
||||
"""
|
||||
if ProjectMembership.objects.filter(project=project, user=user, is_deleted=False).exists():
|
||||
if ProjectMembership.objects.filter(project=project, user_id=user_id, is_deleted=False).exists():
|
||||
raise ValidationError({"user_id": "This user is already a member of the project."})
|
||||
|
||||
return ProjectMembership.objects.create(
|
||||
project=project,
|
||||
user=user,
|
||||
user_id=user_id,
|
||||
role=role,
|
||||
is_active=True
|
||||
)
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
from django.db import transaction
|
||||
from django.shortcuts import get_object_or_404
|
||||
from rest_framework.exceptions import ValidationError, PermissionDenied
|
||||
|
||||
from apps.clients.models import Client
|
||||
from apps.projects.models import Project, ProjectMembership
|
||||
from apps.workspaces.models import WorkspaceMembership
|
||||
|
||||
@@ -53,6 +55,10 @@ def update_project(project, **kwargs):
|
||||
if Project.objects.filter(workspace=project.workspace, name=kwargs["name"], is_deleted=False).exists():
|
||||
raise ValidationError({"name": "A project with this name already exists in the workspace."})
|
||||
|
||||
client_id = kwargs.pop("client")
|
||||
client = get_object_or_404(Client, id=client_id, is_deleted=False) if client_id else None
|
||||
kwargs["client"] = client
|
||||
|
||||
for field, value in kwargs.items():
|
||||
if hasattr(project, field) and getattr(project, field) != value:
|
||||
setattr(project, field, value)
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
from apps.projects.models import ProjectRate, ProjectUserRate
|
||||
|
||||
def create_project_rate(project, amount, currency="USD"):
|
||||
return ProjectRate.objects.create(
|
||||
project=project,
|
||||
amount=amount,
|
||||
currency=currency
|
||||
)
|
||||
from apps.projects.models import ProjectRate, ProjectUserRate
|
||||
|
||||
def create_project_rate(project, hourly_rate, currency="USD"):
|
||||
return ProjectRate.objects.create(
|
||||
project=project,
|
||||
hourly_rate=hourly_rate,
|
||||
currency=currency
|
||||
)
|
||||
|
||||
def update_project_rate(rate_instance, **kwargs):
|
||||
update_fields = []
|
||||
@@ -20,13 +20,13 @@ def update_project_rate(rate_instance, **kwargs):
|
||||
|
||||
return rate_instance
|
||||
|
||||
def create_project_user_rate(project, user, amount, currency="USD"):
|
||||
return ProjectUserRate.objects.create(
|
||||
project=project,
|
||||
user=user,
|
||||
amount=amount,
|
||||
currency=currency
|
||||
)
|
||||
def create_project_user_rate(project, user_id, hourly_rate, currency="USD"):
|
||||
return ProjectUserRate.objects.create(
|
||||
project=project,
|
||||
user_id=user_id,
|
||||
hourly_rate=hourly_rate,
|
||||
currency=currency
|
||||
)
|
||||
|
||||
def update_project_user_rate(user_rate_instance, **kwargs):
|
||||
update_fields = []
|
||||
|
||||
Reference in New Issue
Block a user