3939from core .services .ai_services import AIService
4040from core .services .collaboration_services import CollaborationService
4141from core .services .converter_services import YdocConverter
42- from core .services .notion_import import import_notion
42+ from core .services .notion_import import (
43+ ImportedDocument ,
44+ build_notion_session ,
45+ fetch_all_pages ,
46+ import_page ,
47+ link_child_page_to_parent ,
48+ )
4349from core .tasks .mail import send_ask_for_access_mail
4450from core .utils import extract_attachments , filter_descendants
4551
52+ from ..notion_schemas .notion_page import NotionPage
4653from . import permissions , serializers , utils
4754from .filters import DocumentFilter , ListDocumentFilter
4855
@@ -2134,7 +2141,7 @@ def _import_notion_doc_content(imported_doc, obj, user):
21342141 obj .save ()
21352142
21362143
2137- def _import_notion_child_page (imported_doc , parent_doc , user , imported_docs_by_page_id ):
2144+ def _import_notion_child_page (imported_doc , parent_doc , user , imported_ids ):
21382145 obj = parent_doc .add_child (
21392146 creator = user ,
21402147 title = imported_doc .page .get_title () or "J'aime les carottes" ,
@@ -2148,13 +2155,13 @@ def _import_notion_child_page(imported_doc, parent_doc, user, imported_docs_by_p
21482155
21492156 _import_notion_doc_content (imported_doc , obj , user )
21502157
2151- imported_docs_by_page_id [ imported_doc .page .id ] = obj
2158+ imported_ids . append ( imported_doc .page .id )
21522159
21532160 for child in imported_doc .children :
2154- _import_notion_child_page (child , obj , user , imported_docs_by_page_id )
2161+ _import_notion_child_page (child , obj , user , imported_ids )
21552162
21562163
2157- def _import_notion_root_page (imported_doc , user , imported_docs_by_page_id ) :
2164+ def _import_notion_root_page (imported_doc , user ) -> list [ str ] :
21582165 obj = models .Document .add_root (
21592166 depth = 1 ,
21602167 creator = user ,
@@ -2168,23 +2175,82 @@ def _import_notion_root_page(imported_doc, user, imported_docs_by_page_id):
21682175 role = models .RoleChoices .OWNER ,
21692176 )
21702177
2171- _import_notion_doc_content ( imported_doc , obj , user )
2178+ imported_ids = [ imported_doc . page . id ]
21722179
2173- imported_docs_by_page_id [ imported_doc . page . id ] = obj
2180+ _import_notion_doc_content ( imported_doc , obj , user )
21742181
21752182 for child in imported_doc .children :
2176- _import_notion_child_page (child , obj , user , imported_docs_by_page_id )
2183+ _import_notion_child_page (child , obj , user , imported_ids )
21772184
2185+ return imported_ids
21782186
2179- @drf .decorators .api_view (["GET" , "POST" ]) # TODO: drop GET (used for testing)
2180- def notion_import_run (request ):
2181- if "notion_token" not in request .session :
2182- raise drf .exceptions .PermissionDenied ()
21832187
2184- imported_docs = import_notion (request .session ["notion_token" ])
2188+ def _generate_notion_progress (
2189+ all_pages : list [NotionPage ], page_statuses : dict [str , str ]
2190+ ) -> str :
2191+ raw = json .dumps (
2192+ [
2193+ {
2194+ "title" : page .get_title (),
2195+ "status" : page_statuses [page .id ],
2196+ }
2197+ for page in all_pages
2198+ ]
2199+ )
2200+ return f"data: { raw } \n \n "
2201+
21852202
2186- imported_docs_by_page_id = {}
2187- for imported_doc in imported_docs :
2188- _import_notion_root_page ( imported_doc , request . user , imported_docs_by_page_id )
2203+ def _notion_import_event_stream ( request ):
2204+ session = build_notion_session ( request . session [ "notion_token" ])
2205+ all_pages = fetch_all_pages ( session )
21892206
2190- return drf .response .Response ({"sava" : "oui et toi ?" })
2207+ page_statuses = {}
2208+ for page in all_pages :
2209+ page_statuses [page .id ] = "pending"
2210+
2211+ yield _generate_notion_progress (all_pages , page_statuses )
2212+
2213+ docs_by_page_id : dict [str , ImportedDocument ] = {}
2214+ child_page_blocs_ids_to_parent_page_ids : dict [str , str ] = {}
2215+
2216+ for page in all_pages :
2217+ docs_by_page_id [page .id ] = import_page (
2218+ session , page , child_page_blocs_ids_to_parent_page_ids
2219+ )
2220+ page_statuses [page .id ] = "fetched"
2221+ yield _generate_notion_progress (all_pages , page_statuses )
2222+
2223+ for page in all_pages :
2224+ link_child_page_to_parent (
2225+ page , docs_by_page_id , child_page_blocs_ids_to_parent_page_ids
2226+ )
2227+
2228+ root_docs = [doc for doc in docs_by_page_id .values () if doc .page .is_root ()]
2229+
2230+ for root_doc in root_docs :
2231+ imported_ids = _import_notion_root_page (root_doc , request .user )
2232+ for imported_id in imported_ids :
2233+ page_statuses [imported_id ] = "imported"
2234+
2235+ yield _generate_notion_progress (all_pages , page_statuses )
2236+
2237+
2238+ class IgnoreClientContentNegotiation (drf .negotiation .BaseContentNegotiation ):
2239+ def select_parser (self , request , parsers ):
2240+ return parsers [0 ]
2241+
2242+ def select_renderer (self , request , renderers , format_suffix ):
2243+ return (renderers [0 ], renderers [0 ].media_type )
2244+
2245+
2246+ class NotionImportRunView (drf .views .APIView ):
2247+ content_negotiation_class = IgnoreClientContentNegotiation
2248+
2249+ def get (self , request , format = None ):
2250+ if "notion_token" not in request .session :
2251+ raise drf .exceptions .PermissionDenied ()
2252+
2253+ # return drf.response.Response({"sava": "oui et toi ?"})
2254+ return StreamingHttpResponse (
2255+ _notion_import_event_stream (request ), content_type = "text/event-stream"
2256+ )
0 commit comments