1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102 |
- # TODO - G.M - 28-03-2018 - [Models] Check if this file is needed for Tracimv2,
- # if yes, adapt it.
- # # -*- coding: utf-8 -*-
- # import cherrypy
- #
- # import types
- #
- # from babel.dates import format_timedelta
- # from babel.dates import format_datetime
- #
- # from datetime import datetime
- # import tg
- # from tracim.translation import fake_translator as _
- # from tg.util import LazyString
- #
- # from depot.manager import DepotManager
- #
- # from tracim.logger import logger
- # from tracim.lib.user import CurrentUserGetterApifrom tracim.model.auth import Profile
- # from tracim.model.auth import User
- # from tracim.model.data import BreadcrumbItem, ActionDescription
- # from tracim.model.data import ContentStatus
- # from tracim.model.data import ContentRevisionRO
- # from tracim.model.data import LinkItem
- # from tracim.model.data import NodeTreeItem
- # from tracim.model.data import Content
- # from tracim.model.data import ContentType
- # from tracim.model.data import RoleType
- # from tracim.model.data import UserRoleInWorkspace
- # from tracim.model.data import VirtualEvent
- # from tracim.model.data import Workspace
- #
- # from tracim.model import data as pmd
- # from tracim.lib import CST
- #
- # #############################################################"
- # ##
- # ## HERE COMES THE SERIALIZATION CLASSES
- # ##
- # ## The following code allow to define with high level
- # ## of granularity the way models are serialized
- # ##
- #
- # class pod_serializer(object):
- # """
- # This decorator allow to define a function being a converter of a Model in a Context
- #
- # """
- # def __init__(self, model_class, context):
- # """
- # :param model_class: the model class to serialize. Should be a class defined in tracim.model.auth or tracim.model.data
- # :param context: the Context string which should defined in CTX class
- # :return:
- # """
- # assert hasattr(CTX, context)
- # self.context = context
- # self.model_class = model_class
- #
- # def __call__(self, func):
- # Context.register_converter(self.context, self.model_class, func)
- # return func
- #
- # class ContextConverterNotFoundException(Exception):
- # def __init__(self, context_string, model_class):
- # message = 'converter not found (context: {0} - model: {1})'.format(context_string, model_class.__name__)
- # Exception.__init__(self, message)
- #
- # class CTX(object):
- # """ constants that are used for serialization / dictification of models"""
- # ADMIN_USER = 'ADMIN_USER'
- # ADMIN_WORKSPACE = 'ADMIN_WORKSPACE'
- # ADMIN_WORKSPACES = 'ADMIN_WORKSPACES'
- # CONTENT_LIST = 'CONTENT_LIST'
- # CONTENT_HISTORY = 'CONTENT_HISTORY'
- # CURRENT_USER = 'CURRENT_USER'
- # DEFAULT = 'DEFAULT' # default context. This will allow to define a serialization method to be used by default
- # EMAIL_NOTIFICATION = 'EMAIL_NOTIFICATION'
- # FILE = 'FILE'
- # FILES = 'FILES'
- # FOLDER = 'FOLDER'
- # FOLDER_CONTENT_LIST = 'FOLDER_CONTENT_LIST'
- # FOLDERS = 'FOLDERS'
- # MENU_API = 'MENU_API'
- # MENU_API_BUILD_FROM_TREE_ITEM = 'MENU_API_BUILD_FROM_TREE_ITEM'
- # PAGE = 'PAGE'
- # PAGES = 'PAGES'
- # SEARCH = 'SEARCH'
- # THREAD = 'THREAD'
- # THREADS = 'THREADS'
- # USER = 'USER'
- # USERS = 'USERS'
- # WORKSPACE = 'WORKSPACE'
- # API_WORKSPACE = 'API_WORKSPACE'
- # API_CALENDAR_WORKSPACE = 'API_CALENDAR_WORKSPACE'
- # API_CALENDAR_USER = 'API_CALENDAR_USER'
- #
- #
- # class DictLikeClass(dict):
- # """
- # This class allow to use dictionnary with property like access to values.
- # eg.: user = { 'login': 'damien', 'password': 'bob'}
- # will be accessible in the templates like following:
- # ${user.login}
- # ${user.password}
- # """
- # __getattr__ = dict.__getitem__
- # __setattr__ = dict.__setitem__
- #
- #
- # class Context(object):
- # """
- # Convert a series of mapped objects into ClassLikeDict (a dictionnary which can be accessed through properties)
- # example: obj = ClassLikeDict({'foo': 'bar'}) allow to call obj.foo
- # """
- #
- # _converters = dict()
- #
- # @classmethod
- # def register_converter(cls, context_string, model_class, convert_function):
- # """
- #
- # :param context_string:
- # :param model_class:
- # :param convert_function:
- # :return:
- # """
- # if context_string not in Context._converters:
- # Context._converters[context_string] = dict()
- #
- # if model_class not in Context._converters[context_string]:
- # logger.info(Context, 'Registering Serialization feature: [ {2} | {1} | {0} ]'.format(
- # convert_function.__name__,
- # model_class.__name__,
- # context_string))
- #
- # Context._converters[context_string][model_class] = convert_function
- #
- # @classmethod
- # def get_converter(cls, context_string, model_class):
- # """
- # :param context_string:
- # :param model_class:
- # :return:
- # """
- # try:
- # converter = Context._converters[context_string][model_class]
- # return converter
- # except KeyError:
- # if CTX.DEFAULT in Context._converters:
- # if model_class in Context._converters[CTX.DEFAULT]:
- # return Context._converters[CTX.DEFAULT][model_class]
- #
- # raise ContextConverterNotFoundException(context_string, model_class)
- #
- # def __init__(self, context_string, base_url='', current_user=None):
- # """
- # """
- # self.context_string = context_string
- # self._current_user = current_user # Allow to define the current user if any
- # if not current_user:
- # self._current_user = CurrentUserGetterApi.get_current_user()
- #
- # self._base_url = base_url # real root url like http://mydomain.com:8080
- #
- # def url(self, base_url='/', params=None, qualified=False) -> str:
- # # HACK (REF WSGIDAV.CONTEXT.TG.URL) This is a temporary hack who
- # # permit to know we are in WSGIDAV context.
- # if not hasattr(cherrypy.request, 'current_user_email'):
- # url = tg.url(base_url, params)
- # else:
- # url = base_url
- #
- # if self._base_url:
- # url = '{}{}'.format(self._base_url, url)
- # return url
- #
- # def get_user(self):
- # return self._current_user
- #
- # def toDict(self, serializableObject, key_value_for_a_list_object='', key_value_for_list_item_nb=''):
- # """
- # Converts a given object into a recursive dictionnary like structure.
- # :param serializableObject: the structure to be serialized. this may be any type of object, or list
- # :param key_value_for_a_list_object: if set, then the result will e a dictionnary with the given key.
- # :param key_value_for_list_item_nb: in case of serializableObject being a list, then this key allow to add item number as property
- # :return:
- # """
- # result = DictLikeClass()
- #
- # if serializableObject==None:
- # return None
- #
- # if isinstance(serializableObject, (int, str, LazyString)):
- # return serializableObject
- #
- # if isinstance(serializableObject, (list, tuple, types.GeneratorType)) and not isinstance(serializableObject, str):
- # # Case of lists
- # list_of_objects = list()
- # for item in serializableObject:
- # list_of_objects.append(self.toDict(item))
- #
- # if not key_value_for_a_list_object:
- # return list_of_objects
- # else:
- # result[key_value_for_a_list_object] = list_of_objects
- #
- # if key_value_for_list_item_nb:
- # result[key_value_for_list_item_nb] = len(serializableObject)
- # return result
- #
- # if isinstance(serializableObject, dict):
- # # Case of dictionnaries
- # for key, value in serializableObject.items():
- # result[key] = self.toDict(value)
- #
- # return result
- #
- # # Default case now
- # if key_value_for_a_list_object:
- # serialized_object = self.toDictSpecific(serializableObject)
- # result[key_value_for_a_list_object] = serialized_object
- # else:
- # result = self.toDictSpecific(serializableObject)
- #
- # return result
- #
- #
- # def toDictSpecific(self, serializableObject):
- # """
- # Convert to a dictonnary the specific classes. This code will search for the right convert function which
- # must have been developped and registered.
- #
- # :param serializableObject: an object to be serialized
- # :return: a ClassLikeDict instance
- # """
- # converter_function = Context.get_converter(self.context_string, serializableObject.__class__)
- # result = converter_function(serializableObject, self) # process the object with the given serializer
- #
- # assert isinstance(result, DictLikeClass)
- # return result
- #
- #
- # ########################################################################################################################
- # ## ActionDescription
- #
- # @pod_serializer(ActionDescription, CTX.DEFAULT)
- # def serialize_breadcrumb_item(action: ActionDescription, context: Context):
- # return DictLikeClass(
- # id = action.id,
- # icon = action.icon,
- # label = action.label
- # )
- #
- # ########################################################################################################################
- # ## BREADCRUMB
- #
- # @pod_serializer(BreadcrumbItem, CTX.DEFAULT)
- # def serialize_breadcrumb_item(item: BreadcrumbItem, context: Context):
- # return DictLikeClass(
- # icon = item.icon,
- # label = item.label,
- # url = item.url,
- # is_active = item.is_active
- # )
- #
- # ########################################################################################################################
- # ## Content
- #
- # @pod_serializer(ContentRevisionRO, CTX.PAGE)
- # @pod_serializer(ContentRevisionRO, CTX.FILE)
- # def serialize_version_for_page_or_file(version: ContentRevisionRO, context: Context):
- # return DictLikeClass(
- # id = version.revision_id,
- # label = version.label,
- # owner = context.toDict(version.owner),
- # created = version.created,
- # action = context.toDict(version.get_last_action()),
- # )
- #
- #
- # @pod_serializer(Content, CTX.DEFAULT)
- # def serialize_breadcrumb_item(content: Content, context: Context):
- # return DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # folder = context.toDict(DictLikeClass(id = content.parent.content_id if content.parent else None)),
- # workspace = context.toDict(content.workspace)
- # )
- #
- # @pod_serializer(Content, CTX.EMAIL_NOTIFICATION)
- # def serialize_item(content: Content, context: Context):
- # if ContentType.Comment==content.type:
- # content = content.parent
- #
- # result = DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # icon = ContentType.get_icon(content.type),
- # status = context.toDict(content.get_status()),
- # folder = context.toDict(DictLikeClass(id = content.parent.content_id if content.parent else None)),
- # workspace = context.toDict(content.workspace),
- # is_deleted = content.is_deleted,
- # is_archived = content.is_archived,
- # url = context.url('/workspaces/{wid}/folders/{fid}/{ctype}/{cid}'.format(wid = content.workspace_id, fid=content.parent_id, ctype=content.type+'s', cid=content.content_id)),
- # last_action = context.toDict(content.get_last_action())
- # )
- #
- # return result
- #
- #
- # @pod_serializer(Content, CTX.MENU_API)
- # def serialize_content_for_menu_api(content: Content, context: Context):
- # content_id = content.content_id
- # workspace_id = content.workspace_id
- #
- # has_children = False
- # if content.type == ContentType.Folder:
- # has_children = content.get_child_nb(ContentType.Any) > 0
- #
- # result = DictLikeClass(
- # id = CST.TREEVIEW_MENU.ID_TEMPLATE__FULL.format(workspace_id, content_id),
- # children = has_children,
- # text = content.get_label(),
- # a_attr = { 'href' : context.url(ContentType.fill_url(content))},
- # li_attr = { 'title': content.get_label(), 'class': 'tracim-tree-item-is-a-folder' },
- # type = content.type,
- # state = { 'opened': True if ContentType.Folder!=content.type else False, 'selected': False }
- # )
- # return result
- #
- #
- # @pod_serializer(Content, CTX.FILES)
- # @pod_serializer(Content, CTX.PAGES)
- # def serialize_node_for_page_list(content: Content, context: Context):
- #
- # if content.type==ContentType.Page:
- # if not content.parent:
- # folder = None
- # else:
- # folder = Context(CTX.DEFAULT).toDict(content.parent)
- #
- # result = DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # status = context.toDict(content.get_status()),
- # folder = folder
- # )
- # return result
- #
- # if content.type==ContentType.File:
- # result = DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # status = context.toDict(content.get_status()),
- # folder = Context(CTX.DEFAULT).toDict(content.parent)
- # )
- # return result
- #
- #
- # # TODO - DA - 2014-10-16 - THE FOLLOWING CODE SHOULD BE REMOVED
- # #
- # # if content.type==ContentType.Folder:
- # # return DictLikeClass(
- # # id = content.content_id,
- # # label = content.label,
- # # )
- #
- # raise NotImplementedError('node type / context not implemented: {} {}'. format(content.type, context.context_string))
- #
- #
- # @pod_serializer(Content, CTX.PAGE)
- # @pod_serializer(Content, CTX.FILE)
- # def serialize_node_for_page(content: Content, context: Context):
- #
- # if content.type in (ContentType.Page, ContentType.File) :
- # data_container = content
- #
- # # The following properties are overriden by revision values
- # if content.revision_to_serialize>0:
- # for revision in content.revisions:
- # if revision.revision_id==content.revision_to_serialize:
- # data_container = revision
- # break
- #
- # result = DictLikeClass(
- # id=content.content_id,
- # parent=context.toDict(content.parent),
- # workspace=context.toDict(content.workspace),
- # type=content.type,
- # is_new=content.has_new_information_for(context.get_user()),
- # content=data_container.description,
- # created=data_container.created,
- # updated=content.last_revision.updated,
- # label=data_container.label,
- # icon=ContentType.get_icon(content.type),
- # owner=context.toDict(content.first_revision.owner),
- # last_modification_author=context.toDict(content.last_revision.owner),
- # status=context.toDict(data_container.get_status()),
- # links=[],
- # revision_nb = len(content.revisions),
- # selected_revision='latest' if content.revision_to_serialize<=0 else content.revision_to_serialize,
- # history=Context(CTX.CONTENT_HISTORY).toDict(content.get_history(drop_empty_revision=True)), # nopep8
- # is_editable=content.is_editable,
- # is_deleted=content.is_deleted,
- # is_archived=content.is_archived,
- # urls = context.toDict({
- # 'mark_read': context.url(Content.format_path('/workspaces/{wid}/folders/{fid}/{ctype}s/{cid}/put_read', content)),
- # 'mark_unread': context.url(Content.format_path('/workspaces/{wid}/folders/{fid}/{ctype}s/{cid}/put_unread', content))
- # })
- # )
- #
- # if content.type == ContentType.File:
- # depot = DepotManager.get()
- # depot_stored_file = depot.get(data_container.depot_file)
- # result.label = content.label
- # result['file'] = DictLikeClass(
- # name=data_container.file_name,
- # size=depot_stored_file.content_length,
- # mimetype=data_container.file_mimetype)
- # return result
- #
- # if content.type==ContentType.Folder:
- # value = DictLikeClass(
- # id=content.content_id,
- # label=content.label,
- # is_new=content.has_new_information_for(context.get_user()),
- # )
- # return value
- #
- # raise NotImplementedError
- #
- #
- # @pod_serializer(VirtualEvent, CTX.CONTENT_HISTORY)
- # def serialize_content_for_history(event: VirtualEvent, context: Context):
- # urls = DictLikeClass({'delete': None})
- # if ContentType.Comment == event.type.id:
- # urls = context.toDict({
- # 'delete': context.url('/workspaces/{wid}/folders/{fid}/{ctype}/{cid}/comments/{commentid}/put_delete'.format(
- # wid = event.ref_object.workspace_id,
- # fid=event.ref_object.parent.parent_id,
- # ctype=event.ref_object.parent.type+'s',
- # cid=event.ref_object.parent.content_id,
- # commentid=event.ref_object.content_id))
- # })
- #
- # return DictLikeClass(
- # owner=context.toDict(event.owner),
- # id=event.id,
- # label=event.label,
- # type=context.toDict(event.type),
- # created=event.created,
- # created_as_delta=event.created_as_delta(),
- # content=event.content,
- # is_new=event.ref_object.has_new_information_for(context.get_user()),
- # urls = urls
- # )
- #
- # @pod_serializer(Content, CTX.THREAD)
- # def serialize_node_for_thread(item: Content, context: Context):
- # if item.type==ContentType.Thread:
- # return DictLikeClass(
- # content = item.description,
- # created = item.created,
- # updated = item.last_revision.updated,
- # revision_nb = len(item.revisions),
- # icon = ContentType.get_icon(item.type),
- # id = item.content_id,
- # label = item.label,
- # links=[],
- # owner = context.toDict(item.owner),
- # last_modification_author=context.toDict(item.last_revision.owner),
- # parent = context.toDict(item.parent),
- # selected_revision = 'latest',
- # status = context.toDict(item.get_status()),
- # type = item.type,
- # workspace = context.toDict(item.workspace),
- # comments = reversed(context.toDict(item.get_comments())),
- # is_new=item.has_new_information_for(context.get_user()),
- # history = Context(CTX.CONTENT_HISTORY).toDict(item.get_history(drop_empty_revision=True)), # nopep8
- # is_editable=item.is_editable,
- # is_deleted=item.is_deleted,
- # is_archived=item.is_archived,
- # urls = context.toDict({
- # 'mark_read': context.url(Content.format_path('/workspaces/{wid}/folders/{fid}/{ctype}s/{cid}/put_read', item)),
- # 'mark_unread': context.url(Content.format_path('/workspaces/{wid}/folders/{fid}/{ctype}s/{cid}/put_unread', item))
- # }),
- # )
- #
- # if item.type==ContentType.Comment:
- # return DictLikeClass(
- # is_new=item.has_new_information_for(context.get_user()),
- # content = item.description,
- # created = item.created,
- # created_as_delta = item.created_as_delta(),
- # icon = ContentType.get_icon(item.type),
- # id = item.content_id,
- # label = item.label,
- # owner = context.toDict(item.owner),
- # # REMOVE parent = context.toDict(item.parent),
- # type = item.type,
- # urls = context.toDict({
- # 'delete': context.url('/workspaces/{wid}/folders/{fid}/{ctype}/{cid}/comments/{commentid}/put_delete'.format(wid = item.workspace_id, fid=item.parent.parent_id, ctype=item.parent.type+'s', cid=item.parent.content_id, commentid=item.content_id))
- # })
- # )
- #
- # if item.type==ContentType.Folder:
- # return Context(CTX.DEFAULT).toDict(item)
- #
- #
- #
- # @pod_serializer(Content, CTX.THREADS)
- # def serialize_node_for_thread_list(content: Content, context: Context):
- # if content.type==ContentType.Thread:
- # return DictLikeClass(
- # id = content.content_id,
- # url=ContentType.fill_url(content),
- # label=content.get_label(),
- # status=context.toDict(content.get_status()),
- # folder=context.toDict(content.parent),
- # workspace=context.toDict(content.workspace) if content.workspace else None,
- # comment_nb=len(content.get_comments())
- # )
- #
- # if content.type==ContentType.Folder:
- # return Context(CTX.DEFAULT).toDict(content)
- #
- # raise NotImplementedError
- #
- # @pod_serializer(Content, CTX.WORKSPACE)
- # @pod_serializer(Content, CTX.FOLDERS)
- # def serialize_content_for_workspace(content: Content, context: Context):
- # thread_nb_all = content.get_child_nb(ContentType.Thread)
- # thread_nb_open = content.get_child_nb(ContentType.Thread)
- # file_nb_all = content.get_child_nb(ContentType.File)
- # file_nb_open = content.get_child_nb(ContentType.File)
- # folder_nb_all = content.get_child_nb(ContentType.Folder)
- # folder_nb_open = content.get_child_nb(ContentType.Folder)
- # page_nb_all = content.get_child_nb(ContentType.Page)
- # page_nb_open = content.get_child_nb(ContentType.Page)
- #
- # content_nb_all = thread_nb_all +\
- # thread_nb_open +\
- # file_nb_all +\
- # file_nb_open +\
- # folder_nb_all +\
- # folder_nb_open +\
- # page_nb_all +\
- # page_nb_open
- #
- #
- # result = None
- # if content.type==ContentType.Folder:
- # result = DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # thread_nb = DictLikeClass(
- # all = thread_nb_all,
- # open = thread_nb_open,
- # ),
- # file_nb = DictLikeClass(
- # all = file_nb_all,
- # open = file_nb_open,
- # ),
- # folder_nb = DictLikeClass(
- # all = folder_nb_all,
- # open = folder_nb_open,
- # ),
- # page_nb = DictLikeClass(
- # all = page_nb_all,
- # open = page_nb_open,
- # ),
- # content_nb = DictLikeClass(all = content_nb_all),
- # is_editable=content.is_editable,
- # )
- #
- # return result
- #
- # @pod_serializer(Content, CTX.FOLDER)
- # def serialize_content_for_workspace_and_folder(content: Content, context: Context):
- # thread_nb_all = content.get_child_nb(ContentType.Thread)
- # thread_nb_open = content.get_child_nb(ContentType.Thread)
- # file_nb_all = content.get_child_nb(ContentType.File)
- # file_nb_open = content.get_child_nb(ContentType.File)
- # folder_nb_all = content.get_child_nb(ContentType.Folder)
- # folder_nb_open = content.get_child_nb(ContentType.Folder)
- # page_nb_all = content.get_child_nb(ContentType.Page)
- # page_nb_open = content.get_child_nb(ContentType.Page)
- #
- # content_nb_all = thread_nb_all +\
- # thread_nb_open +\
- # file_nb_all +\
- # file_nb_open +\
- # folder_nb_all +\
- # folder_nb_open +\
- # page_nb_all +\
- # page_nb_open
- #
- #
- # result = None
- # if content.type==ContentType.Folder:
- # allowed_content = DictLikeClass(content.properties['allowed_content']),
- #
- # result = DictLikeClass(
- # id=content.content_id,
- # label=content.label,
- # created=content.created,
- # updated=content.last_revision.updated,
- # last_modification_author=context.toDict(content.last_revision.owner),
- # revision_nb=len(content.revisions),
- # workspace=context.toDict(content.workspace),
- # allowed_content=DictLikeClass(content.properties['allowed_content']),
- # allowed_content_types=context.toDict(content.get_allowed_content_types()),
- # selected_revision='latest',
- # status=context.toDict(content.get_status()),
- # owner=context.toDict(content.owner),
- # thread_nb=DictLikeClass(all=thread_nb_all,
- # open=thread_nb_open),
- # file_nb=DictLikeClass(all=file_nb_all,
- # open=file_nb_open),
- # folder_nb=DictLikeClass(all=folder_nb_all,
- # open=folder_nb_open),
- # page_nb=DictLikeClass(all=page_nb_all,
- # open=page_nb_open),
- # content_nb=DictLikeClass(all = content_nb_all),
- # is_archived=content.is_archived,
- # is_deleted=content.is_deleted,
- # is_editable=content.is_editable,
- # )
- #
- # elif content.type==ContentType.Page:
- # result = DictLikeClass(
- # id = content.content_id,
- # label = content.label,
- # created = content.created,
- # workspace = context.toDict(content.workspace),
- # owner = DictLikeClass(
- # id = content.owner.user_id,
- # name = content.owner.get_display_name()
- # ),
- # status = DictLikeClass(id='', label=''), #FIXME - EXPORT DATA
- # )
- #
- # return result
- #
- #
- # @pod_serializer(Content, CTX.CONTENT_LIST)
- # def serialize_content_for_general_list(content: Content, context: Context):
- # content_type = ContentType(content.type)
- #
- # last_activity_date = content.get_last_activity_date()
- # last_activity_date_formatted = format_datetime(last_activity_date,
- # locale=tg.i18n.get_lang()[0])
- # last_activity_label = format_timedelta(
- # datetime.utcnow() - last_activity_date,
- # locale=tg.i18n.get_lang()[0],
- # )
- # last_activity_label = last_activity_label.replace(' ', '\u00A0') # espace insécable
- #
- # return DictLikeClass(
- # id=content.content_id,
- # folder = DictLikeClass({'id': content.parent_id}) if content.parent else None,
- # workspace=context.toDict(content.workspace) if content.workspace else None,
- # label=content.get_label(),
- # url=ContentType.fill_url(content),
- # type=DictLikeClass(content_type.toDict()),
- # status=context.toDict(content.get_status()),
- # is_deleted=content.is_deleted,
- # is_archived=content.is_archived,
- # is_editable=content.is_editable,
- # last_activity = DictLikeClass({'date': last_activity_date,
- # 'label': last_activity_date_formatted,
- # 'delta': last_activity_label})
- # )
- #
- # @pod_serializer(Content, CTX.FOLDER_CONTENT_LIST)
- # def serialize_content_for_folder_content_list(content: Content, context: Context):
- # content_type = ContentType(content.type)
- #
- # last_activity_date = content.get_last_activity_date()
- # last_activity_date_formatted = format_datetime(last_activity_date,
- # locale=tg.i18n.get_lang()[0])
- # last_activity_label = format_timedelta(datetime.utcnow() - last_activity_date,
- # locale=tg.i18n.get_lang()[0])
- # last_activity_label = last_activity_label.replace(' ', '\u00A0') # espace insécable
- #
- #
- # item = None
- # if ContentType.Thread == content.type:
- # item = Context(CTX.THREADS).toDict(content)
- # item.type = context.toDict(content_type)
- # item.folder = DictLikeClass({'id': content.parent_id}) if content.parent else None
- # item.workspace = DictLikeClass({'id': content.workspace.workspace_id}) if content.workspace else None
- # item.last_activity = DictLikeClass({'date': last_activity_date,
- # 'label': last_activity_date_formatted,
- # 'delta': last_activity_label})
- #
- # comments = content.get_comments()
- # if len(comments)>1:
- # item.notes = _('{nb} messages').format(nb=len(comments))
- # else:
- # item.notes = _('1 message')
- #
- # elif ContentType.File == content.type:
- # item = Context(CTX.CONTENT_LIST).toDict(content)
- # if len(content.revisions)>1:
- # item.notes = _('{nb} revisions').format(nb=len(content.revisions))
- # else:
- # item.notes = _('1 revision')
- #
- # elif ContentType.Folder == content.type:
- # item = Context(CTX.CONTENT_LIST).toDict(content)
- # item.notes = ''
- #
- # folder_nb = content.get_child_nb(ContentType.Folder)
- # if folder_nb == 1:
- # item.notes += _('1 subfolder<br/>\n')
- # elif folder_nb > 1:
- # item.notes += _('{} subfolders<br/>').format(folder_nb)
- #
- # file_nb = content.get_child_nb(ContentType.File, ContentStatus.OPEN)
- # if file_nb == 1:
- # item.notes += _('1 open file<br/>\n')
- # elif file_nb > 1:
- # item.notes += _('{} open files<br/>').format(file_nb)
- #
- # thread_nb = content.get_child_nb(ContentType.Thread, ContentStatus.OPEN)
- # if thread_nb == 1:
- # item.notes += _('1 open thread<br/>\n')
- # elif thread_nb > 1:
- # item.notes += _('{} open threads<br/>').format(thread_nb)
- #
- # page_nb = content.get_child_nb(ContentType.Page, ContentStatus.OPEN)
- # if page_nb == 1:
- # item.notes += _('1 open page<br/>\n')
- # elif page_nb > 1:
- # item.notes += _('{} open pages<br/>').format(page_nb)
- # else:
- # item = Context(CTX.CONTENT_LIST).toDict(content)
- # item.notes = ''
- #
- # item.is_deleted = content.is_deleted
- # item.is_archived = content.is_archived
- # item.is_editable = content.is_editable
- #
- # return item
- #
- #
- # @pod_serializer(ContentType, CTX.DEFAULT)
- # def serialize_breadcrumb_item(content_type: ContentType, context: Context):
- # return DictLikeClass(content_type.toDict())
- #
- #
- # @pod_serializer(Content, CTX.SEARCH)
- # def serialize_content_for_search_result(content: Content, context: Context):
- #
- # def serialize_it():
- # nonlocal content
- #
- # if content.type == ContentType.Comment:
- # logger.info('serialize_content_for_search_result', 'Serializing parent class {} instead of {} [content #{}]'.format(content.parent.type, content.type, content.content_id))
- # content = content.parent
- #
- # data_container = content
- #
- # if content.revision_to_serialize>0:
- # for revision in content.revisions:
- # if revision.revision_id==content.revision_to_serialize:
- # data_container = revision
- # break
- #
- # # FIXME - D.A. - 2015-02-23 - This import should not be there...
- # from tracim.lib.content import ContentApi
- # breadcrumbs = ContentApi(None).build_breadcrumb(data_container.workspace, data_container.content_id, skip_root=True)
- #
- # last_comment_datetime = data_container.updated
- # comments = data_container.get_comments()
- # if comments:
- # last_comment_datetime = max(last_comment_datetime, max(comment.updated for comment in comments))
- #
- # content_type = ContentType(content.type)
- # result = DictLikeClass(
- # id = content.content_id,
- # type = DictLikeClass(content_type.toDict()),
- # parent = context.toDict(content.parent),
- # workspace = context.toDict(content.workspace),
- #
- # content = data_container.description,
- # content_raw = data_container.description_as_raw_text(),
- #
- # created = data_container.created,
- # created_as_delta = data_container.created_as_delta(),
- # label = data_container.label,
- # icon = ContentType.get_icon(content.type),
- # owner = context.toDict(data_container.owner),
- # status = context.toDict(data_container.get_status()),
- # breadcrumb = context.toDict(breadcrumbs),
- # last_activity=last_comment_datetime,
- # last_activity_as_delta=content.datetime_as_delta(last_comment_datetime)
- # )
- #
- # if content.type==ContentType.File:
- # result.label = content.label.__str__()
- #
- # if not result.label or ''==result.label:
- # result.label = 'No title'
- #
- # return result
- #
- # return serialize_it()
- #
- #
- #
- # ########################################################################################################################
- # # ContentStatus
- #
- # @pod_serializer(ContentStatus, CTX.DEFAULT)
- # def serialize_content_status(status: ContentStatus, context: Context):
- # return DictLikeClass(
- # id = status.id,
- # label = status.label,
- # icon = status.icon,
- # css = status.css
- # )
- #
- # ########################################################################################################################
- # # LinkItem
- #
- # @pod_serializer(LinkItem, CTX.DEFAULT)
- # def serialize_content_status(link: LinkItem, context: Context):
- # return DictLikeClass(
- # href = link.href,
- # label = link.href,
- # )
- #
- # ########################################################################################################################
- # # Profile
- # @pod_serializer(Profile, CTX.DEFAULT)
- # def serialize_user_list_default(profile: Profile, context: Context):
- # return DictLikeClass(
- # id = profile.id,
- # name = profile.name,
- # label = profile.label
- # )
- #
- # ########################################################################################################################
- # ## ROLE TYPE
- #
- #
- # @pod_serializer(RoleType, CTX.ADMIN_WORKSPACE)
- # @pod_serializer(RoleType, CTX.ADMIN_USER)
- # def serialize_role_list_for_select_field_in_workspace(role_type: RoleType, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = role_type.role_type_id
- # result['icon'] = role_type.icon
- # result['label'] = role_type.role_label
- # result['style'] = role_type.css_style
- # return result
- #
- #
- # ########################################################################################################################
- # ## USER
- #
- # @pod_serializer(User, CTX.DEFAULT)
- # @pod_serializer(User, CTX.ADMIN_WORKSPACE)
- # def serialize_user_default(user: User, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = user.user_id
- # result['name'] = user.get_display_name()
- # return result
- #
- # @pod_serializer(User, CTX.USERS)
- # @pod_serializer(User, CTX.ADMIN_WORKSPACE)
- # def serialize_user_list_default(user: User, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = user.user_id
- # result['name'] = user.get_display_name()
- # result['email'] = user.email
- # result['enabled'] = user.is_active
- # result['profile'] = user.profile
- # result['has_password'] = user.password!=None
- # result['timezone'] = user.timezone
- # return result
- #
- #
- #
- # @pod_serializer(User, CTX.USER)
- # @pod_serializer(User, CTX.ADMIN_USER)
- # @pod_serializer(User, CTX.CURRENT_USER)
- # def serialize_user_for_user(user: User, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = user.user_id
- # result['name'] = user.get_display_name()
- # result['email'] = user.email
- # result['roles'] = context.toDict(user.get_active_roles())
- # result['enabled'] = user.is_active
- # result['profile'] = user.profile
- # result['calendar_url'] = user.calendar_url
- # result['timezone'] = user.timezone
- #
- # return result
- #
- # ########################################################################################################################
- # ## USER ROLE IN WORKSPACE
- #
- # @pod_serializer(UserRoleInWorkspace, CTX.ADMIN_WORKSPACE)
- # @pod_serializer(UserRoleInWorkspace, CTX.WORKSPACE)
- # def serialize_role_in_workspace(role: UserRoleInWorkspace, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = role.user_id
- # result['icon'] = role.icon
- # result['name'] = role.user.display_name
- # result['role'] = role.role
- # result['style'] = role.style
- # result['role_description'] = role.role_as_label()
- # result['email'] = role.user.email
- # result['user'] = context.toDict(role.user)
- # result['notifications_subscribed'] = role.do_notify
- # return result
- #
- #
- # @pod_serializer(UserRoleInWorkspace, CTX.USER)
- # @pod_serializer(UserRoleInWorkspace, CTX.CURRENT_USER)
- # @pod_serializer(UserRoleInWorkspace, CTX.ADMIN_USER)
- # def serialize_role_in_list_for_user(role: UserRoleInWorkspace, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = role.role
- # result['icon'] = role.icon
- # result['label'] = role.role_as_label()
- # result['style'] = RoleType(role.role).css_style
- # result['workspace'] = context.toDict(role.workspace)
- # result['user'] = Context(CTX.DEFAULT).toDict(role.user)
- # result['notifications_subscribed'] = role.do_notify
- #
- # # result['workspace_name'] = role.workspace.label
- #
- # return result
- #
- # ########################################################################################################################
- # ## WORKSPACE
- #
- # @pod_serializer(Workspace, CTX.DEFAULT)
- # def serialize_workspace_default(workspace: Workspace, context: Context):
- # result = DictLikeClass(
- # id = workspace.workspace_id,
- # label = workspace.label, # FIXME - 2015-08-20 - remove this property
- # name = workspace.label, # use name instead of label
- # is_deleted=workspace.is_deleted,
- # url = context.url('/workspaces/{}'.format(workspace.workspace_id))
- # )
- # return result
- #
- # @pod_serializer(Workspace, CTX.USER)
- # @pod_serializer(Workspace, CTX.CURRENT_USER)
- # def serialize_workspace_in_list_for_one_user(workspace: Workspace, context: Context):
- # """
- # Actually, roles are serialized as users (with minimal information)
- # :param role:
- # :param context:
- # :return:
- # """
- # result = DictLikeClass()
- # result['id'] = workspace.workspace_id
- # result['name'] = workspace.label
- # result['is_deleted'] = workspace.is_deleted
- #
- # return result
- #
- # @pod_serializer(Workspace, CTX.ADMIN_WORKSPACES)
- # def serialize_workspace_in_list(workspace: pmd.Workspace, context: Context):
- # result = DictLikeClass()
- # result['id'] = workspace.workspace_id
- # result['label'] = workspace.label
- # result['description'] = workspace.description
- # result['member_nb'] = len(workspace.roles)
- # result['calendar_enabled'] = workspace.calendar_enabled
- # result['calendar_url'] = workspace.calendar_url
- #
- # return result
- #
- #
- # @pod_serializer(Workspace, CTX.ADMIN_WORKSPACE)
- # @pod_serializer(Workspace, CTX.WORKSPACE)
- # def serialize_workspace_complete(workspace: pmd.Workspace, context: Context):
- # result = DictLikeClass()
- # result['id'] = workspace.workspace_id
- # result['label'] = workspace.label
- # result['description'] = workspace.description
- # result['created'] = workspace.created
- # result['members'] = context.toDict(workspace.roles)
- # result['member_nb'] = len(workspace.roles)
- # result['allowed_content_types'] = context.toDict(workspace.get_allowed_content_types())
- # result['calendar_enabled'] = workspace.calendar_enabled
- # result['calendar_url'] = workspace.calendar_url
- #
- # return result
- #
- # @pod_serializer(Workspace, CTX.MENU_API)
- # def serialize_workspace_for_menu_api(workspace: Workspace, context: Context):
- # result = DictLikeClass(
- # id = CST.TREEVIEW_MENU.ID_TEMPLATE__WORKSPACE_ONLY.format(workspace.workspace_id),
- # children = True, # TODO: make this dynamic
- # text = workspace.label,
- # a_attr = { 'href' : context.url('/workspaces/{}'.format(workspace.workspace_id)) },
- # li_attr = { 'title': workspace.label, 'class': 'tracim-tree-item-is-a-workspace' },
- # type = 'workspace',
- # state = { 'opened': False, 'selected': False }
- # )
- # return result
- #
- # @pod_serializer(NodeTreeItem, CTX.MENU_API_BUILD_FROM_TREE_ITEM)
- # def serialize_node_tree_item_for_menu_api_tree(item: NodeTreeItem, context: Context):
- # if isinstance(item.node, Content):
- # ContentType.fill_url(item.node)
- #
- # return DictLikeClass(
- # id=CST.TREEVIEW_MENU.ID_TEMPLATE__FULL.format(item.node.workspace_id, item.node.content_id),
- # children=True if ContentType.Folder==item.node.type and len(item.children)<=0 else context.toDict(item.children),
- # text=item.node.get_label(),
- # a_attr={'href': context.url(ContentType.fill_url(item.node)) },
- # li_attr={'title': item.node.get_label()},
- # # type='folder',
- # type=item.node.type,
- # state={'opened': True if ContentType.Folder==item.node.type and len(item.children)>0 else False, 'selected': item.is_selected}
- # )
- # elif isinstance(item.node, Workspace):
- # return DictLikeClass(
- # id=CST.TREEVIEW_MENU.ID_TEMPLATE__WORKSPACE_ONLY.format(item.node.workspace_id),
- # children=True if len(item.children)<=0 else context.toDict(item.children),
- # text=item.node.label,
- # a_attr={'href': context.url(ContentType.fill_url_for_workspace(item.node))},
- # li_attr={'title': item.node.get_label()},
- # type='workspace',
- # state={'opened': True if len(item.children)>0 else False, 'selected': item.is_selected}
- # )
- #
- #
- # @pod_serializer(Workspace, CTX.API_WORKSPACE)
- # def serialize_api_workspace(item: Workspace, context: Context):
- # return DictLikeClass(
- # id=item.workspace_id,
- # label=item.label,
- # description=item.description,
- # has_calendar=item.calendar_enabled,
- # )
- #
- #
- # @pod_serializer(Workspace, CTX.API_CALENDAR_WORKSPACE)
- # def serialize_api_calendar_workspace(item: Workspace, context: Context):
- # return DictLikeClass(
- # id=item.workspace_id,
- # label=item.label,
- # description=item.description,
- # type='workspace',
- # )
- #
- #
- # @pod_serializer(User, CTX.API_CALENDAR_USER)
- # def serialize_api_calendar_workspace(item: User, context: Context):
- # from tracim.lib.calendar import CalendarManager # Cyclic import
- # return DictLikeClass(
- # id=item.user_id,
- # label=item.display_name,
- # description=CalendarManager.get_personal_calendar_description(),
- # type='user',
- # )
|