|
21 | 21 | from .reconcile import reconcile |
22 | 22 | from .redirects import ensure_redirect |
23 | 23 | from .sources import ( |
| 24 | + RESERVED_USERNAMES, |
24 | 25 | OrcidRateLimitError, |
25 | 26 | enumerate_mw_users, |
26 | 27 | fetch_orcid_record, |
@@ -51,9 +52,11 @@ def summary(self) -> str: |
51 | 52 | def _build_proposals(config: SyncConfig, osw: Any, session: Any): |
52 | 53 | """Enumerate MediaWiki users, enrich ORCID users and map to proposals.""" |
53 | 54 | excluded = tuple(config.excluded_groups) if config.exclude_bot_group else () |
| 55 | + reserved = RESERVED_USERNAMES if config.exclude_system_usernames else () |
54 | 56 | mw_users = enumerate_mw_users( |
55 | 57 | osw.mw_site, |
56 | 58 | excluded_groups=excluded, |
| 59 | + excluded_usernames=reserved, |
57 | 60 | include_non_orcid=config.include_non_orcid, |
58 | 61 | limit=config.limit, |
59 | 62 | ) |
@@ -98,28 +101,36 @@ def _store_users(osw: Any, resolution: Resolution, report: SyncReport) -> None: |
98 | 101 | entities = [] |
99 | 102 | for resolved in resolution.resolved: |
100 | 103 | proposed = resolved.change.proposed |
101 | | - if resolved.action == "create": |
102 | | - entities.append(build_user(proposed)) |
103 | | - report.created.append(proposed.full_page_title) |
104 | | - elif resolved.action == "update": |
105 | | - entities.append( |
106 | | - apply_update(resolved.change.existing, proposed, resolved.apply_fields) |
107 | | - ) |
108 | | - report.updated.append(proposed.full_page_title) |
109 | | - else: |
110 | | - report.skipped.append(proposed.full_page_title) |
| 104 | + try: |
| 105 | + if resolved.action == "create": |
| 106 | + entities.append(build_user(proposed)) |
| 107 | + report.created.append(proposed.full_page_title) |
| 108 | + elif resolved.action == "update": |
| 109 | + entities.append( |
| 110 | + apply_update( |
| 111 | + resolved.change.existing, proposed, resolved.apply_fields |
| 112 | + ) |
| 113 | + ) |
| 114 | + report.updated.append(proposed.full_page_title) |
| 115 | + else: |
| 116 | + report.skipped.append(proposed.full_page_title) |
| 117 | + except Exception as exc: # pragma: no cover - build failure path |
| 118 | + report.failed[f"build:{proposed.username}"] = str(exc) |
111 | 119 | if entities: |
112 | | - osw.store_entity( |
113 | | - OSW.StoreEntityParam( |
114 | | - entities=entities, overwrite=True, edit_comment="user-sync" |
| 120 | + try: |
| 121 | + osw.store_entity( |
| 122 | + OSW.StoreEntityParam( |
| 123 | + entities=entities, overwrite=True, edit_comment="user-sync" |
| 124 | + ) |
115 | 125 | ) |
116 | | - ) |
| 126 | + except Exception as exc: # pragma: no cover - network failure path |
| 127 | + report.failed["store"] = str(exc) |
117 | 128 |
|
118 | 129 |
|
119 | 130 | def _create_redirects(osw: Any, resolution: Resolution, report: SyncReport) -> None: |
| 131 | + # Every in-scope user has an item (created or pre-existing), so ensure the |
| 132 | + # redirect for all of them; a re-run repairs any missing redirect. |
120 | 133 | for resolved in resolution.resolved: |
121 | | - if resolved.action not in ("create", "update"): |
122 | | - continue |
123 | 134 | proposed = resolved.change.proposed |
124 | 135 | try: |
125 | 136 | written = ensure_redirect(osw, proposed.username, proposed.full_page_title) |
|
0 commit comments