Skip to content

Comments

feat: reset failed import logs#986

Merged
ruuushhh merged 4 commits intomasterfrom
reset-failed-import-logs
Feb 17, 2026
Merged

feat: reset failed import logs#986
ruuushhh merged 4 commits intomasterfrom
reset-failed-import-logs

Conversation

@ruuushhh
Copy link
Contributor

@ruuushhh ruuushhh commented Feb 16, 2026

Description

feat: reset failed import logs

Clickup

https://app.clickup.com/

Summary by CodeRabbit

  • Bug Fixes

    • Improved import/export synchronization to ensure stuck imports are reset after handling stuck exports.
  • Chores

    • Updated accounting mappings dependency to the latest compatible version.

@github-actions github-actions bot added the size/XS Extra Small PR label Feb 16, 2026
@coderabbitai
Copy link

coderabbitai bot commented Feb 16, 2026

No actionable comments were generated in the recent review. 🎉


Walkthrough

Added a call to reset stuck imports at the end of the re_export_stuck_exports task and bumped fyle-accounting-mappings from 3.1.0 to 3.2.0 in requirements.txt.

Changes

Cohort / File(s) Summary
Task Logic Enhancement
apps/internal/tasks.py
Imported reset_stuck_imports from fyle_accounting_library.fyle_platform.actions and invoked reset_stuck_imports(prod_workspace_ids) at the end of re_export_stuck_exports.
Dependency Update
requirements.txt
Updated fyle-accounting-mappings from 3.1.0 to 3.2.0.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 A tiny hop, a function call — reset,
Stuck imports freed, no tangled net,
A version nudged, just one small climb,
The rabbit hums: “All in good time!” 🥕

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is incomplete and largely off-topic. It repeats the title instead of providing substantive details, and the ClickUp link is a placeholder. Replace the description with meaningful context about the change, explain why stuck imports need to be reset, and provide the actual ClickUp link.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: reset failed import logs' clearly summarizes the main change, which adds a reset_stuck_imports invocation to handle stuck imports.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch reset-failed-import-logs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

Coverage

Coverage Report
FileStmtsMissCoverMissing
apps
   exceptions.py481373%23, 29–30, 33, 36–37, 40–41, 44–45, 48, 51, 54
apps/fyle
   actions.py182697%352, 400–404
   constants.py10100% 
   helpers.py193796%61, 150–152, 156, 159, 273, 320
   models.py3533191%257–259, 263–265, 355–372, 379–381, 499–520, 553, 567, 633
   queue.py490100% 
   serializers.py380100% 
   signals.py16381%24–26
   tasks.py554799%284, 437, 956, 967–968, 993–994
   views.py890100% 
apps/internal
   actions.py180100% 
   tasks.py71987%36–37, 60–65, 111
   views.py360100% 
apps/mappings
   constants.py20100% 
   exceptions.py911584%24, 30–32, 35, 38–39, 42–43, 50–54, 57
   helpers.py21481%35–39
   models.py260100% 
   queues.py62395%38, 102, 114
   schedules.py160100% 
   signals.py84495%141–147
   tasks.py157597%32, 88–89, 216–218
   views.py120100% 
apps/quickbooks_online
   actions.py71692%44–45, 82–85
   exceptions.py1191488%85–90, 134, 156–163
   helpers.py20385%25, 33, 37
   models.py5951697%22, 24, 28, 80, 97–108, 162, 195, 215, 599, 613, 630, 798, 1002–1003, 1012
   queue.py1831293%67, 93–97, 138, 170–174, 216–220, 265–269, 311–315
   serializers.py660100% 
   tasks.py62912480%153, 175–176, 214–215, 220–224, 270, 274–275, 299, 316, 414–416, 421–425, 465–466, 486–490, 495–499, 555–556, 576–580, 585–589, 644–645, 665–669, 674–678, 687, 720–721, 730, 742, 745, 752–776, 836–848, 889–897, 932–958, 968–976, 987–988
   utils.py8553696%51, 84, 143, 197, 385, 488, 655–664, 975, 1069, 1074, 1126–1131, 1267–1270, 1339, 1415, 1502, 1507, 1573, 1581, 1656–1660, 1713, 1808
   views.py850100% 
apps/quickbooks_online/errors
   helpers.py29197%67
apps/tasks
   models.py680100% 
   serializers.py60100% 
   views.py110100% 
apps/users
   helpers.py120100% 
   models.py140100% 
apps/workspaces
   actions.py2142588%136–138, 145, 300–309, 338, 357–368, 384, 403–414, 427
   enums.py640100% 
   helpers.py190100% 
   models.py1470100% 
   permissions.py59788%31–36, 67
   queue.py80100% 
   serializers.py260100% 
   signals.py320100% 
   system_comments.py200100% 
   tasks.py1791791%80–84, 105, 186, 230, 249–251, 257, 264–267, 319, 323
   utils.py42588%68–77
   views.py142696%75–78, 178–180
apps/workspaces/apis/advanced_configurations
   serializers.py65395%120, 123, 126
   triggers.py160100% 
   views.py110100% 
apps/workspaces/apis/clone_settings
   helpers.py90100% 
   serializers.py53198%89
   views.py220100% 
apps/workspaces/apis/errors
   serializers.py200100% 
   views.py190100% 
apps/workspaces/apis/export_settings
   helpers.py71396%131–133
   serializers.py111397%140, 197, 200
   triggers.py400100% 
   views.py110100% 
apps/workspaces/apis/import_settings
   serializers.py98595%95–96, 152, 155, 159
   triggers.py960100% 
   views.py190100% 
apps/workspaces/apis/map_employees
   serializers.py31197%49
   triggers.py60100% 
   views.py110100% 
fyle_integrations_imports
   dataclasses.py310100% 
   models.py230100% 
   queues.py34682%24, 59, 99, 136, 148–149
   tasks.py1242481%74–75, 79, 94, 100–102, 115, 141, 168–169, 198–202, 220–221, 246–249, 251, 253, 258
fyle_integrations_imports/modules
   base.py1881393%75, 91–92, 126, 184, 200–201, 208, 230–231, 237–238, 369
   categories.py1773083%80, 103–104, 272–273, 283, 296, 298, 342, 351–355, 364–410
   cost_centers.py961485%120–121, 132–133, 152–153, 162, 178, 180, 226, 235–239
   expense_custom_fields.py1213174%83–88, 243–294
   merchants.py1061685%103–109, 179–180, 190, 203, 205, 238–242
   projects.py881484%86–87, 109–110, 120, 142, 144, 191, 198–199, 205–209
   tax_groups.py180100% 
   webhook_attributes.py130695%95, 97–99, 210–211
workers
   actions.py240100% 
   helpers.py370100% 
   worker.py591280%40–49, 80–81, 128
TOTAL779956193% 

Tests Skipped Failures Errors Time
466 0 💤 0 ❌ 0 🔥 55.988s ⏱️

@github-actions
Copy link

Failure. Coverage is below 90%.

Diff Coverage
Diff: origin/master..HEAD, staged and unstaged changes

apps/internal/tasks.py (75.0%): Missing lines 36-37

Total: 8 lines
Missing: 2 lines
Coverage: 75%

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@apps/internal/tasks.py`:
- Around line 34-37: The comparison against a naive datetime causes timezone
mismatches; update the query and update call in the tasks module where
ImportLog.objects.filter(...) sets updated_at__lt=datetime.now() and
import_logs.update(..., updated_at=datetime.now()) to use timezone-aware
datetimes (e.g., datetime.now(timezone.utc)); ensure timezone is imported (from
datetime import datetime, timezone or from django.utils import timezone) and
replace both occurrences that reference datetime.now() for ImportLog
(import_logs) so the filter and the updated_at assignment use timezone-aware
values.
- Line 113: The call to handle_stuck_imports is currently inside the conditional
that checks task_logs.count() and uses workspace_ids_list (which only contains
workspaces with stuck exports), so stuck imports get missed; move the
handle_stuck_imports(...) invocation out of the if block so it always runs, and
call it with prod_workspace_ids instead of workspace_ids_list (update any
variable name references accordingly) to ensure all production workspaces are
checked for stuck imports.
- Line 7: The import is pulling List from
fyle_accounting_library.rabbitmq.helpers instead of the standard typing module;
update the import so that the symbol List is imported from typing (replace the
current List import from fyle_accounting_library.rabbitmq.helpers with an import
from typing) to match the rest of the codebase and ensure consistency for usages
of List in this module (search for the List symbol and the import line to make
the change).
🧹 Nitpick comments (1)
apps/internal/tasks.py (1)

35-37: Minor: avoid redundant queries — .exists() + .count() + .update() is three DB hits.

You can simplify by calling .update() directly and checking the returned row count, which is a single query.

Proposed refactor
-    if import_logs.exists():
-        logger.info('Stuck import logs found: %s', import_logs.count())
-        import_logs.update(status='FAILED', updated_at=datetime.now())
+    updated_count = import_logs.update(status='FAILED', updated_at=datetime.now(tz=timezone.utc))
+    if updated_count:
+        logger.info('Stuck import logs found and reset: %s', updated_count)

from django.db.models import F, Q
from django_q.models import OrmQ, Schedule
from fyle_accounting_library.fyle_platform.enums import ExpenseImportSourceEnum
from fyle_accounting_library.rabbitmq.helpers import List
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, check if the file exists and read the relevant lines
head -50 apps/internal/tasks.py | cat -n

Repository: fylein/fyle-qbo-api

Length of output: 2604


🏁 Script executed:

# Search for all List imports in the repository
rg -n "import List" --type py -A 2

Repository: fylein/fyle-qbo-api

Length of output: 1768


🏁 Script executed:

# Search for List usage in the tasks.py file specifically
rg -n "List\[" apps/internal/tasks.py

Repository: fylein/fyle-qbo-api

Length of output: 122


🏁 Script executed:

# Check if fyle_accounting_library exists in the repo at all
find . -type d -name "fyle_accounting_library" 2>/dev/null | head -20

Repository: fylein/fyle-qbo-api

Length of output: 45


🏁 Script executed:

# Check the imports section of the file more carefully
sed -n '1,30p' apps/internal/tasks.py | cat -n

Repository: fylein/fyle-qbo-api

Length of output: 1559


Import List from typing instead of fyle_accounting_library.rabbitmq.helpers.

Line 7 imports List from fyle_accounting_library.rabbitmq.helpers, but all other files in the codebase import it from typing. This is non-standard and inconsistent. Change the import to use the canonical source:

Proposed fix
-from fyle_accounting_library.rabbitmq.helpers import List
+from typing import List
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from fyle_accounting_library.rabbitmq.helpers import List
from typing import List
🤖 Prompt for AI Agents
In `@apps/internal/tasks.py` at line 7, The import is pulling List from
fyle_accounting_library.rabbitmq.helpers instead of the standard typing module;
update the import so that the symbol List is imported from typing (replace the
current List import from fyle_accounting_library.rabbitmq.helpers with an import
from typing) to match the rest of the codebase and ensure consistency for usages
of List in this module (search for the List symbol and the import line to make
the change).

@github-actions
Copy link

Coverage

Coverage Report
FileStmtsMissCoverMissing
apps
   exceptions.py481373%23, 29–30, 33, 36–37, 40–41, 44–45, 48, 51, 54
apps/fyle
   actions.py182697%352, 400–404
   constants.py10100% 
   helpers.py193796%61, 150–152, 156, 159, 273, 320
   models.py3533191%257–259, 263–265, 355–372, 379–381, 499–520, 553, 567, 633
   queue.py490100% 
   serializers.py380100% 
   signals.py16381%24–26
   tasks.py554799%284, 437, 956, 967–968, 993–994
   views.py890100% 
apps/internal
   actions.py180100% 
   tasks.py71987%36–37, 60–65, 111
   views.py360100% 
apps/mappings
   constants.py20100% 
   exceptions.py911584%24, 30–32, 35, 38–39, 42–43, 50–54, 57
   helpers.py21481%35–39
   models.py260100% 
   queues.py62395%38, 102, 114
   schedules.py160100% 
   signals.py84495%141–147
   tasks.py157597%32, 88–89, 216–218
   views.py120100% 
apps/quickbooks_online
   actions.py71692%44–45, 82–85
   exceptions.py1191488%85–90, 134, 156–163
   helpers.py20385%25, 33, 37
   models.py5951697%22, 24, 28, 80, 97–108, 162, 195, 215, 599, 613, 630, 798, 1002–1003, 1012
   queue.py1831293%67, 93–97, 138, 170–174, 216–220, 265–269, 311–315
   serializers.py660100% 
   tasks.py63412480%153, 178–179, 217–218, 223–227, 273, 277–278, 302, 319, 420–422, 427–431, 471–472, 492–496, 501–505, 561–562, 582–586, 591–595, 650–651, 671–675, 680–684, 693, 726–727, 736, 748, 751, 758–782, 842–854, 895–903, 938–964, 974–982, 993–994
   utils.py8553696%51, 84, 143, 197, 385, 488, 655–664, 975, 1069, 1074, 1126–1131, 1267–1270, 1339, 1415, 1502, 1507, 1573, 1581, 1656–1660, 1713, 1808
   views.py850100% 
apps/quickbooks_online/errors
   helpers.py29197%67
apps/tasks
   models.py680100% 
   serializers.py60100% 
   views.py110100% 
apps/users
   helpers.py120100% 
   models.py140100% 
apps/workspaces
   actions.py2142588%136–138, 145, 300–309, 338, 357–368, 384, 403–414, 427
   enums.py640100% 
   helpers.py190100% 
   models.py1470100% 
   permissions.py59788%31–36, 67
   queue.py80100% 
   serializers.py260100% 
   signals.py320100% 
   system_comments.py200100% 
   tasks.py1791791%80–84, 105, 186, 230, 249–251, 257, 264–267, 319, 323
   utils.py42588%68–77
   views.py142696%75–78, 178–180
apps/workspaces/apis/advanced_configurations
   serializers.py65395%120, 123, 126
   triggers.py160100% 
   views.py110100% 
apps/workspaces/apis/clone_settings
   helpers.py90100% 
   serializers.py53198%89
   views.py220100% 
apps/workspaces/apis/errors
   serializers.py200100% 
   views.py190100% 
apps/workspaces/apis/export_settings
   helpers.py71396%131–133
   serializers.py111397%140, 197, 200
   triggers.py400100% 
   views.py110100% 
apps/workspaces/apis/import_settings
   serializers.py98595%95–96, 152, 155, 159
   triggers.py960100% 
   views.py190100% 
apps/workspaces/apis/map_employees
   serializers.py31197%49
   triggers.py60100% 
   views.py110100% 
fyle_integrations_imports
   dataclasses.py310100% 
   models.py230100% 
   queues.py34682%24, 59, 99, 136, 148–149
   tasks.py1242481%74–75, 79, 94, 100–102, 115, 141, 168–169, 198–202, 220–221, 246–249, 251, 253, 258
fyle_integrations_imports/modules
   base.py1881393%75, 91–92, 126, 184, 200–201, 208, 230–231, 237–238, 369
   categories.py1773083%80, 103–104, 272–273, 283, 296, 298, 342, 351–355, 364–410
   cost_centers.py961485%120–121, 132–133, 152–153, 162, 178, 180, 226, 235–239
   expense_custom_fields.py1213174%83–88, 243–294
   merchants.py1061685%103–109, 179–180, 190, 203, 205, 238–242
   projects.py881484%86–87, 109–110, 120, 142, 144, 191, 198–199, 205–209
   tax_groups.py180100% 
   webhook_attributes.py130695%95, 97–99, 210–211
workers
   actions.py240100% 
   helpers.py370100% 
   worker.py591280%40–49, 80–81, 128
TOTAL780456193% 

Tests Skipped Failures Errors Time
469 0 💤 0 ❌ 0 🔥 53.741s ⏱️

@github-actions
Copy link

Failure. Coverage is below 90%.

Diff Coverage
Diff: origin/master..HEAD, staged and unstaged changes

apps/internal/tasks.py (75.0%): Missing lines 36-37

Total: 8 lines
Missing: 2 lines
Coverage: 75%

@github-actions
Copy link

Coverage

Coverage Report
FileStmtsMissCoverMissing
apps
   exceptions.py481373%23, 29–30, 33, 36–37, 40–41, 44–45, 48, 51, 54
apps/fyle
   actions.py182697%352, 400–404
   constants.py10100% 
   helpers.py193796%61, 150–152, 156, 159, 273, 320
   models.py3533191%257–259, 263–265, 355–372, 379–381, 499–520, 553, 567, 633
   queue.py490100% 
   serializers.py380100% 
   signals.py16381%24–26
   tasks.py554799%284, 437, 956, 967–968, 993–994
   views.py890100% 
apps/internal
   actions.py180100% 
   tasks.py65789%49–54, 100
   views.py360100% 
apps/mappings
   constants.py20100% 
   exceptions.py911584%24, 30–32, 35, 38–39, 42–43, 50–54, 57
   helpers.py21481%35–39
   models.py260100% 
   queues.py62395%38, 102, 114
   schedules.py160100% 
   signals.py84495%141–147
   tasks.py157597%32, 88–89, 216–218
   views.py120100% 
apps/quickbooks_online
   actions.py71692%44–45, 82–85
   exceptions.py1191488%85–90, 134, 156–163
   helpers.py20385%25, 33, 37
   models.py5951697%22, 24, 28, 80, 97–108, 162, 195, 215, 599, 613, 630, 798, 1002–1003, 1012
   queue.py1831293%67, 93–97, 138, 170–174, 216–220, 265–269, 311–315
   serializers.py660100% 
   tasks.py63412480%153, 178–179, 217–218, 223–227, 273, 277–278, 302, 319, 420–422, 427–431, 471–472, 492–496, 501–505, 561–562, 582–586, 591–595, 650–651, 671–675, 680–684, 693, 726–727, 736, 748, 751, 758–782, 842–854, 895–903, 938–964, 974–982, 993–994
   utils.py8553696%51, 84, 143, 197, 385, 488, 655–664, 975, 1069, 1074, 1126–1131, 1267–1270, 1339, 1415, 1502, 1507, 1573, 1581, 1656–1660, 1713, 1808
   views.py850100% 
apps/quickbooks_online/errors
   helpers.py29197%67
apps/tasks
   models.py680100% 
   serializers.py60100% 
   views.py110100% 
apps/users
   helpers.py120100% 
   models.py140100% 
apps/workspaces
   actions.py2142588%136–138, 145, 300–309, 338, 357–368, 384, 403–414, 427
   enums.py640100% 
   helpers.py190100% 
   models.py1470100% 
   permissions.py59788%31–36, 67
   queue.py80100% 
   serializers.py260100% 
   signals.py320100% 
   system_comments.py200100% 
   tasks.py1791791%80–84, 105, 186, 230, 249–251, 257, 264–267, 319, 323
   utils.py42588%68–77
   views.py142696%75–78, 178–180
apps/workspaces/apis/advanced_configurations
   serializers.py65395%120, 123, 126
   triggers.py160100% 
   views.py110100% 
apps/workspaces/apis/clone_settings
   helpers.py90100% 
   serializers.py53198%89
   views.py220100% 
apps/workspaces/apis/errors
   serializers.py200100% 
   views.py190100% 
apps/workspaces/apis/export_settings
   helpers.py71396%131–133
   serializers.py111397%140, 197, 200
   triggers.py400100% 
   views.py110100% 
apps/workspaces/apis/import_settings
   serializers.py98595%95–96, 152, 155, 159
   triggers.py960100% 
   views.py190100% 
apps/workspaces/apis/map_employees
   serializers.py31197%49
   triggers.py60100% 
   views.py110100% 
fyle_integrations_imports
   dataclasses.py310100% 
   models.py230100% 
   queues.py34682%24, 59, 99, 136, 148–149
   tasks.py1242481%74–75, 79, 94, 100–102, 115, 141, 168–169, 198–202, 220–221, 246–249, 251, 253, 258
fyle_integrations_imports/modules
   base.py1881393%75, 91–92, 126, 184, 200–201, 208, 230–231, 237–238, 369
   categories.py1773083%80, 103–104, 272–273, 283, 296, 298, 342, 351–355, 364–410
   cost_centers.py961485%120–121, 132–133, 152–153, 162, 178, 180, 226, 235–239
   expense_custom_fields.py1213174%83–88, 243–294
   merchants.py1061685%103–109, 179–180, 190, 203, 205, 238–242
   projects.py881484%86–87, 109–110, 120, 142, 144, 191, 198–199, 205–209
   tax_groups.py180100% 
   webhook_attributes.py130695%95, 97–99, 210–211
workers
   actions.py240100% 
   helpers.py370100% 
   worker.py591280%40–49, 80–81, 128
TOTAL779855993% 

Tests Skipped Failures Errors Time
469 0 💤 5 ❌ 0 🔥 58.294s ⏱️

@ruuushhh ruuushhh deployed to CI Environment February 17, 2026 09:51 — with GitHub Actions Active
@github-actions
Copy link

Coverage

Coverage Report
FileStmtsMissCoverMissing
apps
   exceptions.py481373%23, 29–30, 33, 36–37, 40–41, 44–45, 48, 51, 54
apps/fyle
   actions.py182697%352, 400–404
   constants.py10100% 
   helpers.py193796%61, 150–152, 156, 159, 273, 320
   models.py3533191%257–259, 263–265, 355–372, 379–381, 499–520, 553, 567, 633
   queue.py490100% 
   serializers.py380100% 
   signals.py16381%24–26
   tasks.py554799%284, 437, 956, 967–968, 993–994
   views.py890100% 
apps/internal
   actions.py180100% 
   tasks.py65789%49–54, 100
   views.py360100% 
apps/mappings
   constants.py20100% 
   exceptions.py911584%24, 30–32, 35, 38–39, 42–43, 50–54, 57
   helpers.py21481%35–39
   models.py260100% 
   queues.py62395%38, 102, 114
   schedules.py160100% 
   signals.py84495%141–147
   tasks.py157597%32, 88–89, 216–218
   views.py120100% 
apps/quickbooks_online
   actions.py71692%44–45, 82–85
   exceptions.py1191488%85–90, 134, 156–163
   helpers.py20385%25, 33, 37
   models.py5951697%22, 24, 28, 80, 97–108, 162, 195, 215, 599, 613, 630, 798, 1002–1003, 1012
   queue.py1831293%67, 93–97, 138, 170–174, 216–220, 265–269, 311–315
   serializers.py660100% 
   tasks.py63412480%153, 178–179, 217–218, 223–227, 273, 277–278, 302, 319, 420–422, 427–431, 471–472, 492–496, 501–505, 561–562, 582–586, 591–595, 650–651, 671–675, 680–684, 693, 726–727, 736, 748, 751, 758–782, 842–854, 895–903, 938–964, 974–982, 993–994
   utils.py8553696%51, 84, 143, 197, 385, 488, 655–664, 975, 1069, 1074, 1126–1131, 1267–1270, 1339, 1415, 1502, 1507, 1573, 1581, 1656–1660, 1713, 1808
   views.py850100% 
apps/quickbooks_online/errors
   helpers.py29197%67
apps/tasks
   models.py680100% 
   serializers.py60100% 
   views.py110100% 
apps/users
   helpers.py120100% 
   models.py140100% 
apps/workspaces
   actions.py2142588%136–138, 145, 300–309, 338, 357–368, 384, 403–414, 427
   enums.py640100% 
   helpers.py190100% 
   models.py1470100% 
   permissions.py59788%31–36, 67
   queue.py80100% 
   serializers.py260100% 
   signals.py320100% 
   system_comments.py200100% 
   tasks.py1791791%80–84, 105, 186, 230, 249–251, 257, 264–267, 319, 323
   utils.py42588%68–77
   views.py142696%75–78, 178–180
apps/workspaces/apis/advanced_configurations
   serializers.py65395%120, 123, 126
   triggers.py160100% 
   views.py110100% 
apps/workspaces/apis/clone_settings
   helpers.py90100% 
   serializers.py53198%89
   views.py220100% 
apps/workspaces/apis/errors
   serializers.py200100% 
   views.py190100% 
apps/workspaces/apis/export_settings
   helpers.py71396%131–133
   serializers.py111397%140, 197, 200
   triggers.py400100% 
   views.py110100% 
apps/workspaces/apis/import_settings
   serializers.py98595%95–96, 152, 155, 159
   triggers.py960100% 
   views.py190100% 
apps/workspaces/apis/map_employees
   serializers.py31197%49
   triggers.py60100% 
   views.py110100% 
fyle_integrations_imports
   dataclasses.py310100% 
   models.py230100% 
   queues.py34682%24, 59, 99, 136, 148–149
   tasks.py1242481%74–75, 79, 94, 100–102, 115, 141, 168–169, 198–202, 220–221, 246–249, 251, 253, 258
fyle_integrations_imports/modules
   base.py1881393%75, 91–92, 126, 184, 200–201, 208, 230–231, 237–238, 369
   categories.py1773083%80, 103–104, 272–273, 283, 296, 298, 342, 351–355, 364–410
   cost_centers.py961485%120–121, 132–133, 152–153, 162, 178, 180, 226, 235–239
   expense_custom_fields.py1213174%83–88, 243–294
   merchants.py1061685%103–109, 179–180, 190, 203, 205, 238–242
   projects.py881484%86–87, 109–110, 120, 142, 144, 191, 198–199, 205–209
   tax_groups.py180100% 
   webhook_attributes.py130695%95, 97–99, 210–211
workers
   actions.py240100% 
   helpers.py370100% 
   worker.py591280%40–49, 80–81, 128
TOTAL779855993% 

Tests Skipped Failures Errors Time
469 0 💤 0 ❌ 0 🔥 57.605s ⏱️

@github-actions
Copy link


Diff Coverage
Diff: origin/master..HEAD, staged and unstaged changes

apps/internal/tasks.py (100%)

Total: 2 lines
Missing: 0 lines
Coverage: 100%

@ruuushhh ruuushhh merged commit b8f3542 into master Feb 17, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/XS Extra Small PR

Development

Successfully merging this pull request may close these issues.

2 participants