@@ -93,17 +93,27 @@ def build_api_url_core(domain, endpoint, params):
9393 return f"{ url } ?{ query } "
9494
9595
96- def sync_journals_from_api ():
96+ def sync_journals_from_api (
97+ collection_acron = None ,
98+ issn_scielo = None ,
99+ from_date_updated = None ,
100+ ):
97101 sync_state = CoreSyncState .get_for_resource (resource = "journal" )
98- from_date_updated = sync_state .get_from_date_updated (
99- settings .CORE_ISSUE_FROM_DATE_CREATED
100- )
102+ if from_date_updated is None :
103+ from_date_updated = sync_state .get_from_date_updated (
104+ settings .CORE_ISSUE_FROM_DATE_CREATED
105+ )
106+
107+ params = {"from_date_updated" : from_date_updated }
108+ if collection_acron :
109+ params ["collection" ] = collection_acron
110+ if issn_scielo :
111+ params ["issn_scielo" ] = issn_scielo
112+
101113 url = build_api_url_core (
102114 domain = settings .CORE_API_DOMAIN ,
103115 endpoint = settings .CORE_JOURNAL_API_ENDPOINT ,
104- params = {
105- "from_date_updated" : from_date_updated
106- }
116+ params = params ,
107117 )
108118 synced_count = 0
109119 skipped_count = 0
@@ -113,20 +123,22 @@ def sync_journals_from_api():
113123 for item in items :
114124 journal = _build_journal_from_api_item (item )
115125 obj , _ = JournalModel .objects .update_or_create (
116- title = journal .title ,
117- defaults = {
118- "short_title" : journal .short_title ,
119- "title_nlm" : journal .title_nlm ,
120- "acronym" : journal .acronym ,
121- "issn" : journal .issn ,
122- "pissn" : journal .pissn ,
123- "eissn" : journal .eissn ,
124- "pubname" : journal .pubname ,
125- },
126+ title = journal .title ,
127+ defaults = {
128+ "short_title" : journal .short_title ,
129+ "title_nlm" : journal .title_nlm ,
130+ "acronym" : journal .acronym ,
131+ "issn" : journal .issn ,
132+ "pissn" : journal .pissn ,
133+ "eissn" : journal .eissn ,
134+ "pubname" : journal .pubname ,
135+ },
126136 )
127137 logger .info (f"Journal { obj } completed" )
138+ synced_count += 1
128139 max_created = track_max_from_item (max_created , item )
129- finalize_core_sync_state (sync_state , max_created )
140+
141+ finalize_core_sync_state (sync_state , max_created )
130142 logger .info (
131143 f"Journal sync finished. Synced={ synced_count } skipped={ skipped_count } "
132144 )
@@ -166,37 +178,56 @@ def build_issue_from_data(item):
166178 return issue_data
167179
168180
169- def sync_issues_from_api ():
181+ def _get_registered_issn_scielo_values (issn_scielo = None ):
182+ queryset = JournalModel .objects .exclude (issn__isnull = True ).exclude (issn = "" )
183+ if issn_scielo :
184+ queryset = queryset .filter (issn = issn_scielo )
185+ return queryset .values_list ("issn" , flat = True ).distinct ()
186+
187+
188+ def sync_issues_from_api (issn_scielo = None , from_date_updated = None ):
170189 sync_state = CoreSyncState .get_for_resource (resource = "issue" )
171- from_date_updated = sync_state .get_from_date_updated (
172- settings .CORE_ISSUE_FROM_DATE_CREATED
173- )
174- url = build_api_url_core (
175- domain = settings .CORE_API_DOMAIN ,
176- endpoint = settings .CORE_ISSUE_API_ENDPOINT ,
177- params = {
178- "from_date_updated" : from_date_updated
179- }
180- )
190+ if from_date_updated is None :
191+ from_date_updated = sync_state .get_from_date_updated (
192+ settings .CORE_ISSUE_FROM_DATE_CREATED
193+ )
194+
195+ registered_issns = _get_registered_issn_scielo_values (issn_scielo = issn_scielo )
196+ if not registered_issns :
197+ logger .warning (
198+ "Issue sync skipped: no registered journals found"
199+ + (f" for issn_scielo={ issn_scielo } " if issn_scielo else "" )
200+ )
201+ return
202+
181203 synced_count = 0
182204 skipped_count = 0
183205 max_created = sync_state .last_updated_at
184206
185- for items in _iter_api_pages (url , "issues" ):
186- for item in items :
187- journal = _get_journal_from_issue_data (item )
188- if not journal :
189- skipped_count += 1
190- continue
191- issue_data = build_issue_from_data (item )
192- issue_data .update ({"journal" : journal })
193- Issue .objects .get_or_create (
194- ** issue_data ,
195- )
196- synced_count += 1
197- max_created = track_max_from_item (max_created , item )
198- finalize_core_sync_state (sync_state , max_created )
207+ for journal_issn in registered_issns :
208+ url = build_api_url_core (
209+ domain = settings .CORE_API_DOMAIN ,
210+ endpoint = settings .CORE_ISSUE_API_ENDPOINT ,
211+ params = {
212+ "from_date_updated" : from_date_updated ,
213+ "issn_scielo" : journal_issn ,
214+ },
215+ )
199216
217+ for items in _iter_api_pages (url , f"issues ({ journal_issn } )" ):
218+ for item in items :
219+ journal = _get_journal_from_issue_data (item )
220+ if not journal :
221+ skipped_count += 1
222+ continue
223+ issue_data = build_issue_from_data (item )
224+ issue_data .update ({"journal" : journal })
225+ Issue .objects .get_or_create (** issue_data )
226+ synced_count += 1
227+ max_created = track_max_from_item (max_created , item )
228+
229+ finalize_core_sync_state (sync_state , max_created )
200230 logger .info (
201- f"Issue sync finished. from_date_created={ from_date_updated } synced={ synced_count } skipped={ skipped_count } "
231+ f"Issue sync finished. from_date_updated={ from_date_updated } "
232+ f"synced={ synced_count } skipped={ skipped_count } "
202233 )
0 commit comments