* chore: migrations and backmigration to move attachments to file asset * chore: move attachments to file assets * chore: update migration file to include created by and updated by and size * chore: remove uninmport errors * chore: make size as float field * fix: file asset uploads * chore: asset uploads migration changes * chore: v2 assets endpoint * chore: remove unused imports * chore: issue attachments * chore: issue attachments * chore: workspace logo endpoints * chore: private bucket changes * chore: user asset endpoint * chore: add logo_url validation * chore: cover image urlk * chore: change asset max length * chore: pages endpoint * chore: store the storage_metadata only when none * chore: attachment asset apis * chore: update create private bucket * chore: make bucket private * chore: fix response of user uploads * fix: response of user uploads * fix: job to fix file asset uploads * fix: user asset endpoints * chore: avatar for user profile * chore: external apis user url endpoint * chore: upload workspace and user asset actions updated * chore: analytics endpoint * fix: analytics export * chore: avatar urls * chore: update user avatar instances * chore: avatar urls for assignees and creators * chore: bucket permission script * fix: all user avatr instances in the web app * chore: update project cover image logic * fix: issue attachment endpoint * chore: patch endpoint for issue attachment * chore: attachments * chore: change attachment storage class * chore: update issue attachment endpoints * fix: issue attachment * chore: update issue attachment implementation * chore: page asset endpoints * fix: web build errors * chore: attachments * chore: page asset urls * chore: comment and issue asset endpoints * chore: asset endpoints * chore: attachment endpoints * chore: bulk asset endpoint * chore: restore endpoint * chore: project assets endpoints * chore: asset url * chore: add delete asset endpoints * chore: fix asset upload endpoint * chore: update patch endpoints * chore: update patch endpoint * chore: update editor image handling * chore: asset restore endpoints * chore: avatar url for space assets * chore: space app assets migration * fix: space app urls * chore: space endpoints * fix: old editor images rendering logic * fix: issue archive and attachment activity * chore: asset deletes * chore: attachment delete * fix: issue attachment * fix: issue attachment get * chore: cover image url for projects * chore: remove duplicate py file * fix: url check function * chore: chore project cover asset delete * fix: migrations * chore: delete migration files * chore: update bucket * fix: build errors * chore: add asset url in intake attachment * chore: project cover fix * chore: update next.config * chore: delete old workspace logos * chore: workspace assets * chore: asset get for space * chore: update project modal * chore: remove unused imports * fix: space app editor helper * chore: update rich-text read-only editor * chore: create multiple column for entity identifiers * chore: update migrations * chore: remove entity identifier * fix: issue assets * chore: update maximum file size logic * chore: update editor max file size logic * fix: close modal after removing workspace logo * chore: update uploaded asstes' status post issue creation * chore: added file size limit to the space app * dev: add file size limit restriction on all endpoints * fix: remove old workspace logo and user avatar --------- Co-authored-by: pablohashescobar <nikhilschacko@gmail.com>
241 lines
6.4 KiB
Python
241 lines
6.4 KiB
Python
# Third party imports
|
|
from rest_framework import serializers
|
|
|
|
# Module import
|
|
from plane.db.models import (
|
|
Account,
|
|
Profile,
|
|
User,
|
|
Workspace,
|
|
WorkspaceMemberInvite,
|
|
)
|
|
|
|
from .base import BaseSerializer
|
|
|
|
|
|
class UserSerializer(BaseSerializer):
|
|
class Meta:
|
|
model = User
|
|
# Exclude password field from the serializer
|
|
fields = [
|
|
field.name
|
|
for field in User._meta.fields
|
|
if field.name != "password"
|
|
]
|
|
# Make all system fields and email read only
|
|
read_only_fields = [
|
|
"id",
|
|
"username",
|
|
"mobile_number",
|
|
"email",
|
|
"token",
|
|
"created_at",
|
|
"updated_at",
|
|
"is_superuser",
|
|
"is_staff",
|
|
"is_managed",
|
|
"last_active",
|
|
"last_login_time",
|
|
"last_logout_time",
|
|
"last_login_ip",
|
|
"last_logout_ip",
|
|
"last_login_uagent",
|
|
"last_location",
|
|
"last_login_medium",
|
|
"created_location",
|
|
"is_bot",
|
|
"is_password_autoset",
|
|
"is_email_verified",
|
|
"is_active",
|
|
"token_updated_at",
|
|
]
|
|
|
|
# If the user has already filled first name or last name then he is onboarded
|
|
def get_is_onboarded(self, obj):
|
|
return bool(obj.first_name) or bool(obj.last_name)
|
|
|
|
|
|
class UserMeSerializer(BaseSerializer):
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
"id",
|
|
"avatar",
|
|
"cover_image",
|
|
"avatar_url",
|
|
"cover_image_url",
|
|
"date_joined",
|
|
"display_name",
|
|
"email",
|
|
"first_name",
|
|
"last_name",
|
|
"is_active",
|
|
"is_bot",
|
|
"is_email_verified",
|
|
"user_timezone",
|
|
"username",
|
|
"is_password_autoset",
|
|
"is_email_verified",
|
|
"last_login_medium",
|
|
]
|
|
read_only_fields = fields
|
|
|
|
|
|
class UserMeSettingsSerializer(BaseSerializer):
|
|
workspace = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
"id",
|
|
"email",
|
|
"workspace",
|
|
]
|
|
read_only_fields = fields
|
|
|
|
def get_workspace(self, obj):
|
|
workspace_invites = WorkspaceMemberInvite.objects.filter(
|
|
email=obj.email
|
|
).count()
|
|
|
|
# profile
|
|
profile = Profile.objects.get(user=obj)
|
|
if (
|
|
profile.last_workspace_id is not None
|
|
and Workspace.objects.filter(
|
|
pk=profile.last_workspace_id,
|
|
workspace_member__member=obj.id,
|
|
workspace_member__is_active=True,
|
|
).exists()
|
|
):
|
|
workspace = Workspace.objects.filter(
|
|
pk=profile.last_workspace_id,
|
|
workspace_member__member=obj.id,
|
|
workspace_member__is_active=True,
|
|
).first()
|
|
return {
|
|
"last_workspace_id": profile.last_workspace_id,
|
|
"last_workspace_slug": (
|
|
workspace.slug if workspace is not None else ""
|
|
),
|
|
"fallback_workspace_id": profile.last_workspace_id,
|
|
"fallback_workspace_slug": (
|
|
workspace.slug if workspace is not None else ""
|
|
),
|
|
"invites": workspace_invites,
|
|
}
|
|
else:
|
|
fallback_workspace = (
|
|
Workspace.objects.filter(
|
|
workspace_member__member_id=obj.id,
|
|
workspace_member__is_active=True,
|
|
)
|
|
.order_by("created_at")
|
|
.first()
|
|
)
|
|
return {
|
|
"last_workspace_id": None,
|
|
"last_workspace_slug": None,
|
|
"fallback_workspace_id": (
|
|
fallback_workspace.id
|
|
if fallback_workspace is not None
|
|
else None
|
|
),
|
|
"fallback_workspace_slug": (
|
|
fallback_workspace.slug
|
|
if fallback_workspace is not None
|
|
else None
|
|
),
|
|
"invites": workspace_invites,
|
|
}
|
|
|
|
|
|
class UserLiteSerializer(BaseSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
"id",
|
|
"first_name",
|
|
"last_name",
|
|
"avatar",
|
|
"avatar_url",
|
|
"is_bot",
|
|
"display_name",
|
|
]
|
|
read_only_fields = [
|
|
"id",
|
|
"is_bot",
|
|
]
|
|
|
|
|
|
class UserAdminLiteSerializer(BaseSerializer):
|
|
class Meta:
|
|
model = User
|
|
fields = [
|
|
"id",
|
|
"first_name",
|
|
"last_name",
|
|
"avatar",
|
|
"avatar_url",
|
|
"is_bot",
|
|
"display_name",
|
|
"email",
|
|
"last_login_medium",
|
|
]
|
|
read_only_fields = [
|
|
"id",
|
|
"is_bot",
|
|
]
|
|
|
|
|
|
class ChangePasswordSerializer(serializers.Serializer):
|
|
model = User
|
|
|
|
"""
|
|
Serializer for password change endpoint.
|
|
"""
|
|
old_password = serializers.CharField(required=True)
|
|
new_password = serializers.CharField(required=True, min_length=8)
|
|
confirm_password = serializers.CharField(required=True, min_length=8)
|
|
|
|
def validate(self, data):
|
|
if data.get("old_password") == data.get("new_password"):
|
|
raise serializers.ValidationError(
|
|
{"error": "New password cannot be same as old password."}
|
|
)
|
|
|
|
if data.get("new_password") != data.get("confirm_password"):
|
|
raise serializers.ValidationError(
|
|
{
|
|
"error": "Confirm password should be same as the new password."
|
|
}
|
|
)
|
|
|
|
return data
|
|
|
|
|
|
class ResetPasswordSerializer(serializers.Serializer):
|
|
"""
|
|
Serializer for password change endpoint.
|
|
"""
|
|
|
|
new_password = serializers.CharField(required=True, min_length=8)
|
|
|
|
|
|
class ProfileSerializer(BaseSerializer):
|
|
class Meta:
|
|
model = Profile
|
|
fields = "__all__"
|
|
read_only_fields = [
|
|
"user",
|
|
]
|
|
|
|
|
|
class AccountSerializer(BaseSerializer):
|
|
class Meta:
|
|
model = Account
|
|
fields = "__all__"
|
|
read_only_fields = [
|
|
"user",
|
|
]
|