# -*- coding: utf-8 -*- import typing from enum import Enum from tracim_backend.exceptions import ContentTypeNotExist from tracim_backend.exceptions import ContentStatusNotExist from tracim_backend.models.applications import html_documents from tracim_backend.models.applications import _file from tracim_backend.models.applications import thread from tracim_backend.models.applications import markdownpluspage #### # Content Status class GlobalStatus(Enum): OPEN = 'open' CLOSED = 'closed' class ContentStatus(object): """ ContentStatus object class """ def __init__( self, slug: str, global_status: str, label: str, fa_icon: str, hexcolor: str, ): self.slug = slug self.global_status = global_status self.label = label self.fa_icon = fa_icon self.hexcolor = hexcolor open_status = ContentStatus( slug='open', global_status=GlobalStatus.OPEN.value, label='Open', fa_icon='square-o', hexcolor='#3f52e3', ) closed_validated_status = ContentStatus( slug='closed-validated', global_status=GlobalStatus.CLOSED.value, label='Validated', fa_icon='check-square-o', hexcolor='#008000', ) closed_unvalidated_status = ContentStatus( slug='closed-unvalidated', global_status=GlobalStatus.CLOSED.value, label='Cancelled', fa_icon='close', hexcolor='#f63434', ) closed_deprecated_status = ContentStatus( slug='closed-deprecated', global_status=GlobalStatus.CLOSED.value, label='Deprecated', fa_icon='warning', hexcolor='#ababab', ) class ContentStatusList(object): OPEN = open_status def __init__(self, extend_content_status: typing.List[ContentStatus]): self._content_status = [self.OPEN] self._content_status.extend(extend_content_status) def get_one_by_slug(self, slug: str) -> ContentStatus: for item in self._content_status: if item.slug == slug: return item raise ContentStatusNotExist() def allowed_slugs_values(self) -> typing.List[str]: return [item.slug for item in self._content_status] def allowed(self) -> typing.List[ContentStatus]: return [item for item in self._content_status] def get_default_status(self) -> ContentStatus: return self.OPEN CONTENT_STATUS = ContentStatusList( [ closed_validated_status, closed_unvalidated_status, closed_deprecated_status, ] ) #### # ContentType class NewContentType(object): """ Future ContentType object class """ def __init__( self, slug: str, fa_icon: str, hexcolor: str, label: str, creation_label: str, available_statuses: typing.List[ContentStatus], ): self.slug = slug self.fa_icon = fa_icon self.hexcolor = hexcolor self.label = label self.creation_label = creation_label self.available_statuses = available_statuses thread_type = NewContentType( slug='thread', fa_icon=thread.fa_icon, hexcolor=thread.hexcolor, label='Thread', creation_label='Discuss about a topic', available_statuses=CONTENT_STATUS.allowed(), ) file_type = NewContentType( slug='file', fa_icon=_file.fa_icon, hexcolor=_file.hexcolor, label='File', creation_label='Upload a file', available_statuses=CONTENT_STATUS.allowed(), ) markdownpluspage_type = NewContentType( slug='markdownpage', fa_icon=markdownpluspage.fa_icon, hexcolor=markdownpluspage.hexcolor, label='Rich Markdown File', creation_label='Create a Markdown document', available_statuses=CONTENT_STATUS.allowed(), ) html_documents_type = NewContentType( slug='html-documents', fa_icon=html_documents.fa_icon, hexcolor=html_documents.hexcolor, label='Text Document', creation_label='Write a document', available_statuses=CONTENT_STATUS.allowed(), ) # TODO - G.M - 31-05-2018 - Set Better folder params folder_type = NewContentType( slug='folder', fa_icon=thread.fa_icon, hexcolor=thread.hexcolor, label='Folder', creation_label='Create collection of any documents', available_statuses=CONTENT_STATUS.allowed(), ) CONTENT_DEFAULT_TYPE = [ thread_type, file_type, markdownpluspage_type, html_documents_type, folder_type, ] # TODO - G.M - 31-05-2018 - Set Better Event params event_type = NewContentType( slug='event', fa_icon=thread.fa_icon, hexcolor=thread.hexcolor, label='Event', creation_label='Event', available_statuses=CONTENT_STATUS.allowed(), ) # TODO - G.M - 31-05-2018 - Set Better Event params comment_type = NewContentType( slug='comment', fa_icon=thread.fa_icon, hexcolor=thread.hexcolor, label='Comment', creation_label='Comment', available_statuses=CONTENT_STATUS.allowed(), ) CONTENT_DEFAULT_TYPE_SPECIAL = [ event_type, comment_type, ] ALL_CONTENTS_DEFAULT_TYPES = CONTENT_DEFAULT_TYPE + CONTENT_DEFAULT_TYPE_SPECIAL class ContentTypeLegacy(NewContentType): """ Temporary remplacement object for Legacy ContentType Object """ # special type Any = 'any' Folder = 'folder' Event = 'event' Comment = 'comment' File = file_type.slug Thread = thread_type.slug Page = html_documents_type.slug PageLegacy = 'page' MarkdownPage = markdownpluspage_type.slug def __init__(self, slug: str): if slug == 'page': slug = ContentTypeLegacy.Page for content_type in ALL_CONTENTS_DEFAULT_TYPES: if slug == content_type.slug: super(ContentTypeLegacy, self).__init__( slug=content_type.slug, fa_icon=content_type.fa_icon, hexcolor=content_type.hexcolor, label=content_type.label, creation_label=content_type.creation_label, available_statuses=content_type.available_statuses ) return raise ContentTypeNotExist() def get_slug_aliases(self) -> typing.List[str]: """ Get all slug aliases of a content, useful for legacy code convertion """ # TODO - G.M - 2018-07-05 - Remove this legacy compat code # when possible. page_alias = [self.Page, self.PageLegacy] if self.slug in page_alias: return page_alias else: return [self.slug] @classmethod def all(cls) -> typing.List[str]: return cls.allowed_types() @classmethod def allowed_types(cls) -> typing.List[str]: contents_types = [status.slug for status in ALL_CONTENTS_DEFAULT_TYPES] return contents_types @classmethod def allowed_type_values(cls) -> typing.List[str]: """ All content type slug + special values like any """ content_types = cls.allowed_types() content_types.append(ContentTypeLegacy.Any) return content_types @classmethod def allowed_types_for_folding(cls): # This method is used for showing only "main" # types in the left-side treeview contents_types = [status.slug for status in CONTENT_DEFAULT_TYPE] return contents_types # TODO - G.M - 30-05-2018 - This method don't do anything. @classmethod def sorted(cls, types: ['ContentType']) -> ['ContentType']: return types @property def id(self): return self.slug def toDict(self): raise NotImplementedError()