# coding=utf-8
import marshmallow
from marshmallow import post_load
from marshmallow.validate import OneOf
from tracim.lib.utils.utils import DATETIME_FORMAT
from tracim.models.auth import Profile
from tracim.models.contents import CONTENT_DEFAULT_TYPE
from tracim.models.contents import CONTENT_DEFAULT_STATUS
from tracim.models.contents import GlobalStatus
from tracim.models.contents import open_status
from tracim.models.context_models import ContentCreation
from tracim.models.context_models import SetContentStatus
from tracim.models.context_models import CommentCreation
from tracim.models.context_models import CommentPath
from tracim.models.context_models import MoveParams
from tracim.models.context_models import WorkspaceAndContentPath
from tracim.models.context_models import ContentFilter
from tracim.models.context_models import LoginCredentials
from tracim.models.context_models import HTMLDocumentUpdate
from tracim.models.context_models import ThreadUpdate
from tracim.models.data import UserRoleInWorkspace
class UserDigestSchema(marshmallow.Schema):
"""
Simple user schema
"""
user_id = marshmallow.fields.Int(dump_only=True, example=3)
avatar_url = marshmallow.fields.Url(
allow_none=True,
example="/api/v2/assets/avatars/suri-cate.jpg",
description="avatar_url is the url to the image file. "
"If no avatar, then set it to null "
"(and frontend will interpret this with a default avatar)",
)
public_name = marshmallow.fields.String(
example='Suri Cate',
)
class UserSchema(UserDigestSchema):
"""
Complete user schema
"""
email = marshmallow.fields.Email(
required=True,
example='suri.cate@algoo.fr'
)
created = marshmallow.fields.DateTime(
format=DATETIME_FORMAT,
description='User account creation date',
)
is_active = marshmallow.fields.Bool(
example=True,
# TODO - G.M - Explains this value.
)
# TODO - G.M - 17-04-2018 - Restrict timezone values
timezone = marshmallow.fields.String(
example="Paris/Europe",
)
# TODO - G.M - 17-04-2018 - check this, relative url allowed ?
caldav_url = marshmallow.fields.Url(
allow_none=True,
relative=True,
attribute='calendar_url',
example="/api/v2/calendar/user/3.ics/",
description="The url for calendar CalDAV direct access",
)
profile = marshmallow.fields.String(
attribute='profile',
validate=OneOf(Profile._NAME),
example='managers',
)
class Meta:
description = 'User account of Tracim'
# Path Schemas
class UserIdPathSchema(marshmallow.Schema):
user_id = marshmallow.fields.Int(example=3, required=True)
class WorkspaceIdPathSchema(marshmallow.Schema):
workspace_id = marshmallow.fields.Int(example=4, required=True)
class ContentIdPathSchema(marshmallow.Schema):
content_id = marshmallow.fields.Int(example=6, required=True)
class WorkspaceAndContentIdPathSchema(
WorkspaceIdPathSchema,
ContentIdPathSchema
):
@post_load
def make_path_object(self, data):
return WorkspaceAndContentPath(**data)
class CommentsPathSchema(WorkspaceAndContentIdPathSchema):
comment_id = marshmallow.fields.Int(
example=6,
description='id of a comment related to content content_id',
required=True
)
@post_load
def make_path_object(self, data):
return CommentPath(**data)
class FilterContentQuerySchema(marshmallow.Schema):
parent_id = marshmallow.fields.Int(
example=2,
default=0,
description='allow to filter items in a folder.'
' If not set, then return all contents.'
' If set to 0, then return root contents.'
' If set to another value, return all contents'
' directly included in the folder parent_id'
)
show_archived = marshmallow.fields.Int(
example=0,
default=0,
description='if set to 1, then show archived contents.'
' Default is 0 - hide archived content'
)
show_deleted = marshmallow.fields.Int(
example=0,
default=0,
description='if set to 1, then show deleted contents.'
' Default is 0 - hide deleted content'
)
show_active = marshmallow.fields.Int(
example=1,
default=1,
description='f set to 1, then show active contents. '
'Default is 1 - show active content.'
' Note: active content are content '
'that is neither archived nor deleted. '
'The reason for this parameter to exist is for example '
'to allow to show only archived documents'
)
@post_load
def make_content_filter(self, data):
return ContentFilter(**data)
###
class BasicAuthSchema(marshmallow.Schema):
email = marshmallow.fields.Email(
example='suri.cate@algoo.fr',
required=True
)
password = marshmallow.fields.String(
example='8QLa$
Html page Content!
') #### class CommentSchema(marshmallow.Schema): content_id = marshmallow.fields.Int(example=6) parent_id = marshmallow.fields.Int(example=34) raw_content = marshmallow.fields.String( example='This is just an html comment !
' ) author = marshmallow.fields.Nested(UserDigestSchema) created = marshmallow.fields.DateTime( format=DATETIME_FORMAT, description='comment creation date', ) class ContentModifySchema(marshmallow.Schema): label = marshmallow.fields.String( example='contract for client XXX', description='New title of the content' ) class HtmlDocumentModifySchema(ContentModifySchema): raw_content = marshmallow.fields.String('Html page Content!
') @post_load def html_document_update(self, data): return HTMLDocumentUpdate(**data) class ThreadModifySchema(ContentModifySchema): raw_content = marshmallow.fields.String('Description of Thread') @post_load def thread_update(self, data): return ThreadUpdate(**data) class SetCommentSchema(marshmallow.Schema): raw_content = marshmallow.fields.String( example='This is just an html comment !
' ) @post_load def create_comment(self, data): return CommentCreation(**data) class SetContentStatusSchema(marshmallow.Schema): status = marshmallow.fields.Str( example='closed-deprecated', validate=OneOf([status.slug for status in CONTENT_DEFAULT_STATUS]), description='this slug is found in content_type available statuses', default=open_status, required=True, ) @post_load def set_status(self, data): return SetContentStatus(**data)