django-ledger 0.7.10__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of django-ledger might be problematic. Click here for more details.

Files changed (115) hide show
  1. django_ledger/__init__.py +1 -1
  2. django_ledger/context.py +12 -0
  3. django_ledger/forms/bill.py +0 -4
  4. django_ledger/forms/closing_entry.py +13 -1
  5. django_ledger/forms/data_import.py +1 -1
  6. django_ledger/forms/estimate.py +3 -6
  7. django_ledger/forms/invoice.py +3 -7
  8. django_ledger/forms/item.py +10 -18
  9. django_ledger/forms/purchase_order.py +2 -4
  10. django_ledger/io/io_core.py +25 -32
  11. django_ledger/io/io_generator.py +7 -6
  12. django_ledger/io/io_library.py +1 -2
  13. django_ledger/migrations/0024_billmodel_entity_model_invoicemodel_entity_model.py +24 -0
  14. django_ledger/migrations/0025_alter_billmodel_cash_account_and_more.py +70 -0
  15. django_ledger/models/accounts.py +109 -69
  16. django_ledger/models/bank_account.py +40 -23
  17. django_ledger/models/bill.py +89 -63
  18. django_ledger/models/chart_of_accounts.py +173 -105
  19. django_ledger/models/closing_entry.py +99 -48
  20. django_ledger/models/customer.py +60 -39
  21. django_ledger/models/data_import.py +55 -41
  22. django_ledger/models/deprecations.py +61 -0
  23. django_ledger/models/entity.py +18 -16
  24. django_ledger/models/estimate.py +57 -28
  25. django_ledger/models/invoice.py +58 -28
  26. django_ledger/models/items.py +503 -142
  27. django_ledger/models/journal_entry.py +61 -47
  28. django_ledger/models/ledger.py +106 -42
  29. django_ledger/models/mixins.py +16 -10
  30. django_ledger/models/purchase_order.py +39 -17
  31. django_ledger/models/transactions.py +152 -113
  32. django_ledger/models/unit.py +57 -30
  33. django_ledger/models/vendor.py +75 -43
  34. django_ledger/report/core.py +2 -14
  35. django_ledger/settings.py +56 -71
  36. django_ledger/static/django_ledger/bundle/djetler.bundle.js +1 -1
  37. django_ledger/static/django_ledger/bundle/djetler.bundle.js.LICENSE.txt +25 -0
  38. django_ledger/static/django_ledger/bundle/styles.bundle.js +1 -1
  39. django_ledger/static/django_ledger/css/djl_styles.css +273 -0
  40. django_ledger/templates/django_ledger/bills/includes/card_bill.html +2 -2
  41. django_ledger/templates/django_ledger/components/menu.html +41 -26
  42. django_ledger/templates/django_ledger/customer/tags/customer_table.html +5 -5
  43. django_ledger/templates/django_ledger/entity/includes/card_entity.html +12 -6
  44. django_ledger/templates/django_ledger/financial_statements/balance_sheet.html +1 -1
  45. django_ledger/templates/django_ledger/financial_statements/cash_flow.html +4 -1
  46. django_ledger/templates/django_ledger/financial_statements/income_statement.html +4 -1
  47. django_ledger/templates/django_ledger/financial_statements/tags/balance_sheet_statement.html +27 -3
  48. django_ledger/templates/django_ledger/financial_statements/tags/cash_flow_statement.html +16 -4
  49. django_ledger/templates/django_ledger/financial_statements/tags/income_statement.html +73 -18
  50. django_ledger/templates/django_ledger/includes/widget_ratios.html +18 -24
  51. django_ledger/templates/django_ledger/invoice/includes/card_invoice.html +3 -3
  52. django_ledger/templates/django_ledger/layouts/base.html +6 -1
  53. django_ledger/templates/django_ledger/vendor/tags/vendor_table.html +9 -5
  54. django_ledger/tests/test_accounts.py +1 -2
  55. django_ledger/tests/test_io.py +17 -0
  56. django_ledger/tests/test_purchase_order.py +3 -3
  57. django_ledger/tests/test_transactions.py +1 -2
  58. django_ledger/urls/__init__.py +0 -4
  59. django_ledger/views/bill.py +8 -13
  60. django_ledger/views/chart_of_accounts.py +6 -4
  61. django_ledger/views/closing_entry.py +11 -7
  62. django_ledger/views/customer.py +13 -17
  63. django_ledger/views/data_import.py +7 -6
  64. django_ledger/views/djl_api.py +3 -5
  65. django_ledger/views/entity.py +2 -4
  66. django_ledger/views/estimate.py +3 -7
  67. django_ledger/views/inventory.py +3 -5
  68. django_ledger/views/invoice.py +4 -6
  69. django_ledger/views/item.py +7 -11
  70. django_ledger/views/journal_entry.py +1 -2
  71. django_ledger/views/mixins.py +25 -19
  72. django_ledger/views/purchase_order.py +24 -35
  73. django_ledger/views/unit.py +1 -2
  74. django_ledger/views/vendor.py +1 -2
  75. {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/METADATA +43 -75
  76. {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/RECORD +80 -108
  77. {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info}/WHEEL +1 -1
  78. django_ledger-0.8.0.dist-info/top_level.txt +1 -0
  79. django_ledger/contrib/django_ledger_graphene/__init__.py +0 -0
  80. django_ledger/contrib/django_ledger_graphene/accounts/schema.py +0 -33
  81. django_ledger/contrib/django_ledger_graphene/api.py +0 -42
  82. django_ledger/contrib/django_ledger_graphene/apps.py +0 -6
  83. django_ledger/contrib/django_ledger_graphene/auth/mutations.py +0 -49
  84. django_ledger/contrib/django_ledger_graphene/auth/schema.py +0 -6
  85. django_ledger/contrib/django_ledger_graphene/bank_account/mutations.py +0 -61
  86. django_ledger/contrib/django_ledger_graphene/bank_account/schema.py +0 -34
  87. django_ledger/contrib/django_ledger_graphene/bill/mutations.py +0 -0
  88. django_ledger/contrib/django_ledger_graphene/bill/schema.py +0 -34
  89. django_ledger/contrib/django_ledger_graphene/coa/mutations.py +0 -0
  90. django_ledger/contrib/django_ledger_graphene/coa/schema.py +0 -30
  91. django_ledger/contrib/django_ledger_graphene/customers/__init__.py +0 -0
  92. django_ledger/contrib/django_ledger_graphene/customers/mutations.py +0 -71
  93. django_ledger/contrib/django_ledger_graphene/customers/schema.py +0 -43
  94. django_ledger/contrib/django_ledger_graphene/data_import/mutations.py +0 -0
  95. django_ledger/contrib/django_ledger_graphene/data_import/schema.py +0 -0
  96. django_ledger/contrib/django_ledger_graphene/entity/mutations.py +0 -0
  97. django_ledger/contrib/django_ledger_graphene/entity/schema.py +0 -94
  98. django_ledger/contrib/django_ledger_graphene/item/mutations.py +0 -0
  99. django_ledger/contrib/django_ledger_graphene/item/schema.py +0 -31
  100. django_ledger/contrib/django_ledger_graphene/journal_entry/mutations.py +0 -0
  101. django_ledger/contrib/django_ledger_graphene/journal_entry/schema.py +0 -35
  102. django_ledger/contrib/django_ledger_graphene/ledger/mutations.py +0 -0
  103. django_ledger/contrib/django_ledger_graphene/ledger/schema.py +0 -32
  104. django_ledger/contrib/django_ledger_graphene/purchase_order/mutations.py +0 -0
  105. django_ledger/contrib/django_ledger_graphene/purchase_order/schema.py +0 -31
  106. django_ledger/contrib/django_ledger_graphene/transaction/mutations.py +0 -0
  107. django_ledger/contrib/django_ledger_graphene/transaction/schema.py +0 -36
  108. django_ledger/contrib/django_ledger_graphene/unit/mutations.py +0 -0
  109. django_ledger/contrib/django_ledger_graphene/unit/schema.py +0 -27
  110. django_ledger/contrib/django_ledger_graphene/vendor/mutations.py +0 -0
  111. django_ledger/contrib/django_ledger_graphene/vendor/schema.py +0 -37
  112. django_ledger/contrib/django_ledger_graphene/views.py +0 -12
  113. django_ledger-0.7.10.dist-info/top_level.txt +0 -4
  114. {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info/licenses}/AUTHORS.md +0 -0
  115. {django_ledger-0.7.10.dist-info → django_ledger-0.8.0.dist-info/licenses}/LICENSE +0 -0
@@ -11,7 +11,8 @@ whether temporarily or indefinitely may be flagged as inactive (i.e. active is F
11
11
  as an option in the UI, but can still be used programmatically (via API).
12
12
  """
13
13
  import os
14
- from uuid import uuid4
14
+ import warnings
15
+ from uuid import uuid4, UUID
15
16
 
16
17
  from django.core.exceptions import ObjectDoesNotExist, ValidationError
17
18
  from django.db import models, transaction, IntegrityError
@@ -19,9 +20,14 @@ from django.db.models import Q, F, QuerySet, Manager
19
20
  from django.utils.text import slugify
20
21
  from django.utils.translation import gettext_lazy as _
21
22
 
23
+ from django_ledger.models.deprecations import deprecated_entity_slug_behavior
22
24
  from django_ledger.models.mixins import ContactInfoMixIn, CreateUpdateMixIn, FinancialAccountInfoMixin, TaxInfoMixIn
23
25
  from django_ledger.models.utils import lazy_loader
24
- from django_ledger.settings import DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING, DJANGO_LEDGER_VENDOR_NUMBER_PREFIX
26
+ from django_ledger.settings import (
27
+ DJANGO_LEDGER_DOCUMENT_NUMBER_PADDING,
28
+ DJANGO_LEDGER_VENDOR_NUMBER_PREFIX,
29
+ DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR
30
+ )
25
31
 
26
32
 
27
33
  def vendor_picture_upload_to(instance, filename):
@@ -42,7 +48,15 @@ class VendorModelQuerySet(QuerySet):
42
48
  Custom defined VendorModel QuerySet.
43
49
  """
44
50
 
45
- def active(self) -> QuerySet:
51
+ def for_user(self, user_model) -> 'VendorModelQuerySet':
52
+ if user_model.is_superuser:
53
+ return self
54
+ return self.filter(
55
+ Q(entity_model__admin=user_model) |
56
+ Q(entity_model__managers__in=[user_model])
57
+ )
58
+
59
+ def active(self) -> 'VendorModelQuerySet':
46
60
  """
47
61
  Active vendors can be assigned to new bills and show on dropdown menus and views.
48
62
 
@@ -53,7 +67,7 @@ class VendorModelQuerySet(QuerySet):
53
67
  """
54
68
  return self.filter(active=True)
55
69
 
56
- def inactive(self) -> QuerySet:
70
+ def inactive(self) -> 'VendorModelQuerySet':
57
71
  """
58
72
  Active vendors can be assigned to new bills and show on dropdown menus and views.
59
73
  Marking VendorModels as inactive can help reduce Database load to populate select inputs and also inactivate
@@ -67,7 +81,7 @@ class VendorModelQuerySet(QuerySet):
67
81
  """
68
82
  return self.filter(active=False)
69
83
 
70
- def hidden(self) -> QuerySet:
84
+ def hidden(self) -> 'VendorModelQuerySet':
71
85
  """
72
86
  Hidden vendors do not show on dropdown menus, but may be used via APIs or any other method that does not
73
87
  involve the UI.
@@ -79,7 +93,7 @@ class VendorModelQuerySet(QuerySet):
79
93
  """
80
94
  return self.filter(hidden=True)
81
95
 
82
- def visible(self) -> QuerySet:
96
+ def visible(self) -> 'VendorModelQuerySet':
83
97
  """
84
98
  Visible vendors show on dropdown menus and views. Visible vendors are active and not hidden.
85
99
 
@@ -95,49 +109,67 @@ class VendorModelQuerySet(QuerySet):
95
109
 
96
110
  class VendorModelManager(Manager):
97
111
  """
98
- Custom defined VendorModel Manager, which defines many methods for initial query of the Database.
99
- """
112
+ Manages operations related to VendorModel instances.
100
113
 
101
- def for_user(self, user_model):
102
- qs = self.get_queryset()
103
- if user_model.is_superuser:
104
- return qs
105
- return qs.filter(
106
- Q(entity_model__admin=user_model) |
107
- Q(entity_model__managers__in=[user_model])
108
- )
114
+ A specialized manager for handling interactions with VendorModel entities,
115
+ providing additional support for filtering based on associated EntityModel or EntityModel slug.
116
+ """
109
117
 
110
- def for_entity(self, entity_slug, user_model) -> VendorModelQuerySet:
118
+ @deprecated_entity_slug_behavior
119
+ def for_entity(self, entity_model: 'EntityModel | str | UUID' = None, **kwargs) -> VendorModelQuerySet:
111
120
  """
112
- Fetches a QuerySet of VendorModel associated with a specific EntityModel & UserModel.
113
- May pass an instance of EntityModel or a String representing the EntityModel slug.
114
-
115
- Parameters
116
- ----------
117
- entity_slug: str or EntityModel
118
- The entity slug or EntityModel used for filtering the QuerySet.
119
- user_model
120
- Logged in and authenticated django UserModel instance.
121
+ Filters the queryset for a given entity model.
122
+
123
+ This method modifies the queryset to include only those records
124
+ associated with the specified entity model. The entity model can
125
+ be provided in various formats such as an instance of `EntityModel`,
126
+ a string representing the entity's slug, or its UUID.
127
+
128
+ If a deprecated parameter `user_model` is provided, it will issue
129
+ a warning and may alter the behavior if the deprecated behavior flag
130
+ `DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR` is set.
131
+
132
+ Parameters
133
+ ----------
134
+ entity_model : EntityModel | str | UUID
135
+ The entity model or its identifier (slug or UUID) to filter the
136
+ queryset by.
137
+
138
+ **kwargs
139
+ Additional parameters for optional functionality. The parameter
140
+ `user_model` is supported for backward compatibility but is
141
+ deprecated and should be avoided.
142
+
143
+ Returns
144
+ -------
145
+ VendorModelQuerySet
146
+ A queryset filtered for the given entity model.
147
+ """
148
+ EntityModel = lazy_loader.get_entity_model()
121
149
 
122
- Examples
123
- ________
124
- >>> request_user = request.user
125
- >>> slug = kwargs['entity_slug'] # may come from request kwargs
126
- >>> vendor_model_qs = VendorModel.objects.for_entity(user_model=request_user, entity_slug=slug)
150
+ qs = self.get_queryset()
151
+ if 'user_model' in kwargs:
152
+ warnings.warn(
153
+ 'user_model parameter is deprecated and will be removed in a future release. '
154
+ 'Use for_user(user_model).for_entity(entity_model) instead to keep current behavior.',
155
+ DeprecationWarning,
156
+ stacklevel=2
157
+ )
127
158
 
128
- Returns
129
- -------
130
- VendorModelQuerySet
131
- A filtered VendorModel QuerySet.
132
- """
133
- qs = self.for_user(user_model)
134
- if isinstance(entity_slug, lazy_loader.get_entity_model()):
135
- return qs.filter(
136
- Q(entity_model=entity_slug)
159
+ if DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR:
160
+ qs = qs.for_user(kwargs['user_model'])
161
+
162
+ if isinstance(entity_model, EntityModel):
163
+ qs = qs.filter(entity_model=entity_model)
164
+ elif isinstance(entity_model, str):
165
+ qs = qs.filter(entity_model__slug__exact=entity_model)
166
+ elif isinstance(entity_model, UUID):
167
+ qs = qs.filter(entity_model_id=entity_model)
168
+ else:
169
+ raise VendorModelValidationError(
170
+ 'EntityModel slug must be either a string or an EntityModel instance'
137
171
  )
138
- return qs.filter(
139
- Q(entity_model__slug__exact=entity_slug)
140
- )
172
+ return qs
141
173
 
142
174
 
143
175
  class VendorModelAbstract(ContactInfoMixIn,
@@ -6,25 +6,16 @@ from django.core.exceptions import ValidationError
6
6
  from django_ledger.io.io_context import IODigestContextManager
7
7
  from django_ledger.models.ledger import LedgerModel
8
8
  from django_ledger.models.unit import EntityUnitModel
9
- from django_ledger.settings import DJANGO_LEDGER_PDF_SUPPORT_ENABLED
10
9
  from django_ledger.templatetags.django_ledger import currency_symbol, currency_format
11
10
 
12
- if DJANGO_LEDGER_PDF_SUPPORT_ENABLED:
13
- from fpdf import FPDF, XPos, YPos
11
+ from fpdf import FPDF, XPos, YPos
14
12
 
15
13
 
16
14
  class PDFReportValidationError(ValidationError):
17
15
  pass
18
16
 
19
17
 
20
- def load_support():
21
- support = list()
22
- if DJANGO_LEDGER_PDF_SUPPORT_ENABLED:
23
- support.append(FPDF)
24
- return support
25
-
26
-
27
- class BaseReportSupport(*load_support()):
18
+ class BaseReportSupport(FPDF):
28
19
  FOOTER_LOGO_PATH = 'django_ledger/logo/django-ledger-logo-report.png'
29
20
 
30
21
  def __init__(self,
@@ -33,9 +24,6 @@ class BaseReportSupport(*load_support()):
33
24
  report_subtitle: Optional[str] = None,
34
25
  **kwargs):
35
26
 
36
- if not DJANGO_LEDGER_PDF_SUPPORT_ENABLED:
37
- raise NotImplementedError('PDF support not enabled.')
38
-
39
27
  super().__init__(*args, **kwargs)
40
28
  self.REPORT_TYPE: Optional[str] = None
41
29
  self.REPORT_SUBTITLE: Optional[str] = report_subtitle
django_ledger/settings.py CHANGED
@@ -10,49 +10,6 @@ from django.conf import settings
10
10
  logger = logging.getLogger('Django Ledger Logger')
11
11
  logger.setLevel(logging.INFO)
12
12
 
13
- try:
14
- from graphene import __version__
15
- from graphene_django import __version__
16
- from oauth2_provider import __version__
17
-
18
- DJANGO_LEDGER_GRAPHQL_SUPPORT_ENABLED = True
19
- except ImportError:
20
- DJANGO_LEDGER_GRAPHQL_SUPPORT_ENABLED = False
21
-
22
- try:
23
- from fpdf import FPDF
24
-
25
- DJANGO_LEDGER_PDF_SUPPORT_ENABLED = True
26
- except ImportError:
27
- DJANGO_LEDGER_PDF_SUPPORT_ENABLED = False
28
-
29
- logger.info(f'Django Ledger GraphQL Enabled: {DJANGO_LEDGER_GRAPHQL_SUPPORT_ENABLED}')
30
-
31
-
32
- ## MODEL ABSTRACTS ##
33
- # DJANGO_LEDGER_ACCOUNT_MODEL = getattr(settings, 'DJANGO_LEDGER_ACCOUNT_MODEL', 'django_ledger.AccountModel')
34
- # DJANGO_LEDGER_CHART_OF_ACCOUNTS_MODEL = getattr(settings, 'DJANGO_LEDGER_ACCOUNT_MODEL', 'django_ledger.ChartOfAccountModel')
35
- # DJANGO_LEDGER_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_TRANSACTION_MODEL', 'django_ledger.TransactionModel')
36
- # DJANGO_LEDGER_JOURNAL_ENTRY_MODEL = getattr(settings, 'DJANGO_LEDGER_JOURNAL_ENTRY_MODEL', 'django_ledger.JournalEntryModel')
37
- # DJANGO_LEDGER_LEDGER_MODEL = getattr(settings, 'DJANGO_LEDGER_LEDGER_MODEL', 'django_ledger.LedgerModel')
38
- # DJANGO_LEDGER_ENTITY_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_MODEL', 'django_ledger.EntityModel')
39
- # DJANGO_LEDGER_ENTITY_STATE_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_STATE_MODEL', 'django_ledger.EntityStateModel')
40
- # DJANGO_LEDGER_ENTITY_UNIT_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_UNIT_MODEL', 'django_ledger.EntityUnitModel')
41
- # DJANGO_LEDGER_ESTIMATE_MODEL = getattr(settings, 'DJANGO_LEDGER_ESTIMATE_MODEL', 'django_ledger.EstimateModel')
42
- # DJANGO_LEDGER_BILL_MODEL = getattr(settings, 'DJANGO_LEDGER_BILL_MODEL', 'django_ledger.BillModel')
43
- # DJANGO_LEDGER_INVOICE_MODEL = getattr(settings, 'DJANGO_LEDGER_INVOICE_MODEL', 'django_ledger.InvoiceModel')
44
- # DJANGO_LEDGER_PURCHASE_ORDER_MODEL = getattr(settings, 'DJANGO_LEDGER_PURCHASE_ORDER_MODEL', 'django_ledger.PurchaseOrderModel')
45
- # DJANGO_LEDGER_CUSTOMER_MODEL = getattr(settings, 'DJANGO_LEDGER_CUSTOMER_MODEL', 'django_ledger.CustomerModel')
46
- # DJANGO_LEDGER_VENDOR_MODEL = getattr(settings, 'DJANGO_LEDGER_VENDOR_MODEL', 'django_ledger.VendorModel')
47
- # DJANGO_LEDGER_BANK_ACCOUNT_MODEL = getattr(settings, 'DJANGO_LEDGER_BANK_ACCOUNT_MODEL', 'django_ledger.BankAccountModel')
48
- # DJANGO_LEDGER_CLOSING_ENTRY_MODEL = getattr(settings, 'DJANGO_LEDGER_CLOSING_ENTRY_MODEL', 'django_ledger.ClosingEntryModel')
49
- # DJANGO_LEDGER_CLOSING_ENTRY_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_CLOSING_ENTRY_TRANSACTION_MODEL', 'django_ledger.ClosingEntryTransactionModel')
50
- # DJANGO_LEDGER_UNIT_OF_MEASURE_MODEL = getattr(settings, 'DJANGO_LEDGER_UNIT_OF_MEASURE_MODEL', 'django_ledger.UnitOfMeasureModel')
51
- # DJANGO_LEDGER_ITEM_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_ITEM_TRANSACTION_MODEL', 'django_ledger.ItemTransactionModel')
52
- # DJANGO_LEDGER_ITEM_MODEL = getattr(settings, 'DJANGO_LEDGER_ITEM_MODEL', 'django_ledger.ItemModel')
53
- # DJANGO_LEDGER_STAGED_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_STAGED_TRANSACTION_MODEL', 'django_ledger.StagedTransactionModel')
54
- # DJANGO_LEDGER_IMPORT_JOB_MODEL = getattr(settings, 'DJANGO_LEDGER_IMPORT_JOB_MODEL', 'django_ledger.ImportJobModel')
55
-
56
13
  DJANGO_LEDGER_USE_CLOSING_ENTRIES = getattr(settings, 'DJANGO_LEDGER_USE_CLOSING_ENTRIES', True)
57
14
  DJANGO_LEDGER_DEFAULT_CLOSING_ENTRY_CACHE_TIMEOUT = getattr(settings,
58
15
  'DJANGO_LEDGER_DEFAULT_CLOSING_ENTRY_CACHE_TIMEOUT', 3600)
@@ -100,65 +57,93 @@ DJANGO_LEDGER_FINANCIAL_ANALYSIS = {
100
57
  'current_ratio': {
101
58
  'good_incremental': True,
102
59
  'ranges': {
103
- 'healthy': 2,
104
- 'watch': 1,
105
- 'warning': .5,
106
- 'critical': .25
60
+ 'healthy': 2.0,
61
+ 'watch': 1.5,
62
+ 'warning': 1.0,
63
+ 'critical': 0.5,
107
64
  }
108
65
  },
109
66
  'quick_ratio': {
110
67
  'good_incremental': True,
111
68
  'ranges': {
112
- 'healthy': 2,
113
- 'watch': 1,
114
- 'warning': .5,
115
- 'critical': .25
69
+ 'healthy': 1.5,
70
+ 'watch': 1.0,
71
+ 'warning': 0.5,
72
+ 'critical': 0.25
116
73
  }
117
74
  },
118
75
  'debt_to_equity': {
119
76
  'good_incremental': False,
120
77
  'ranges': {
121
- 'healthy': 0,
122
- 'watch': .25,
123
- 'warning': .5,
124
- 'critical': 1
78
+ 'healthy': 0.5,
79
+ 'watch': 1.0,
80
+ 'warning': 1.5,
81
+ 'critical': 2.0
125
82
  }
126
83
  },
127
84
  'return_on_equity': {
128
85
  'good_incremental': True,
129
86
  'ranges': {
130
- 'healthy': .10,
131
- 'watch': .07,
132
- 'warning': .04,
133
- 'critical': .02
87
+ 'healthy': 0.15,
88
+ 'watch': 0.10,
89
+ 'warning': 0.05,
90
+ 'critical': 0.00
134
91
  }
135
92
  },
136
93
  'return_on_assets': {
137
94
  'good_incremental': True,
138
95
  'ranges': {
139
- 'healthy': .10,
140
- 'watch': .06,
141
- 'warning': .04,
142
- 'critical': .02
96
+ 'healthy': 0.05,
97
+ 'watch': 0.03,
98
+ 'warning': 0.02,
99
+ 'critical': 0.01
143
100
  }
144
101
  },
145
102
  'net_profit_margin': {
146
103
  'good_incremental': True,
147
104
  'ranges': {
148
- 'healthy': .10,
149
- 'watch': .06,
150
- 'warning': .04,
151
- 'critical': .02
105
+ 'healthy': 0.10,
106
+ 'watch': 0.05,
107
+ 'warning': 0.03,
108
+ 'critical': 0.01
152
109
  }
153
110
  },
154
111
  'gross_profit_margin': {
155
112
  'good_incremental': True,
156
113
  'ranges': {
157
- 'healthy': .10,
158
- 'watch': .06,
159
- 'warning': .04,
160
- 'critical': .02
114
+ 'healthy': 0.50,
115
+ 'watch': 0.30,
116
+ 'warning': 0.20,
117
+ 'critical': 0.10
161
118
  }
162
119
  },
163
120
  }
164
121
  }
122
+
123
+ DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR = getattr(settings, 'DJANGO_LEDGER_USE_DEPRECATED_BEHAVIOR', True)
124
+ DJANGO_LEDGER_THEME = getattr(settings, 'DJANGO_LEDGER_THEME', 'litera')
125
+
126
+ ## MODEL ABSTRACTS ##
127
+
128
+ # DJANGO_LEDGER_ACCOUNT_MODEL = getattr(settings, 'DJANGO_LEDGER_ACCOUNT_MODEL', 'django_ledger.AccountModel')
129
+ # DJANGO_LEDGER_CHART_OF_ACCOUNTS_MODEL = getattr(settings, 'DJANGO_LEDGER_ACCOUNT_MODEL', 'django_ledger.ChartOfAccountModel')
130
+ # DJANGO_LEDGER_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_TRANSACTION_MODEL', 'django_ledger.TransactionModel')
131
+ # DJANGO_LEDGER_JOURNAL_ENTRY_MODEL = getattr(settings, 'DJANGO_LEDGER_JOURNAL_ENTRY_MODEL', 'django_ledger.JournalEntryModel')
132
+ # DJANGO_LEDGER_LEDGER_MODEL = getattr(settings, 'DJANGO_LEDGER_LEDGER_MODEL', 'django_ledger.LedgerModel')
133
+ # DJANGO_LEDGER_ENTITY_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_MODEL', 'django_ledger.EntityModel')
134
+ # DJANGO_LEDGER_ENTITY_STATE_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_STATE_MODEL', 'django_ledger.EntityStateModel')
135
+ # DJANGO_LEDGER_ENTITY_UNIT_MODEL = getattr(settings, 'DJANGO_LEDGER_ENTITY_UNIT_MODEL', 'django_ledger.EntityUnitModel')
136
+ # DJANGO_LEDGER_ESTIMATE_MODEL = getattr(settings, 'DJANGO_LEDGER_ESTIMATE_MODEL', 'django_ledger.EstimateModel')
137
+ # DJANGO_LEDGER_BILL_MODEL = getattr(settings, 'DJANGO_LEDGER_BILL_MODEL', 'django_ledger.BillModel')
138
+ # DJANGO_LEDGER_INVOICE_MODEL = getattr(settings, 'DJANGO_LEDGER_INVOICE_MODEL', 'django_ledger.InvoiceModel')
139
+ # DJANGO_LEDGER_PURCHASE_ORDER_MODEL = getattr(settings, 'DJANGO_LEDGER_PURCHASE_ORDER_MODEL', 'django_ledger.PurchaseOrderModel')
140
+ # DJANGO_LEDGER_CUSTOMER_MODEL = getattr(settings, 'DJANGO_LEDGER_CUSTOMER_MODEL', 'django_ledger.CustomerModel')
141
+ # DJANGO_LEDGER_VENDOR_MODEL = getattr(settings, 'DJANGO_LEDGER_VENDOR_MODEL', 'django_ledger.VendorModel')
142
+ # DJANGO_LEDGER_BANK_ACCOUNT_MODEL = getattr(settings, 'DJANGO_LEDGER_BANK_ACCOUNT_MODEL', 'django_ledger.BankAccountModel')
143
+ # DJANGO_LEDGER_CLOSING_ENTRY_MODEL = getattr(settings, 'DJANGO_LEDGER_CLOSING_ENTRY_MODEL', 'django_ledger.ClosingEntryModel')
144
+ # DJANGO_LEDGER_CLOSING_ENTRY_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_CLOSING_ENTRY_TRANSACTION_MODEL', 'django_ledger.ClosingEntryTransactionModel')
145
+ # DJANGO_LEDGER_UNIT_OF_MEASURE_MODEL = getattr(settings, 'DJANGO_LEDGER_UNIT_OF_MEASURE_MODEL', 'django_ledger.UnitOfMeasureModel')
146
+ # DJANGO_LEDGER_ITEM_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_ITEM_TRANSACTION_MODEL', 'django_ledger.ItemTransactionModel')
147
+ # DJANGO_LEDGER_ITEM_MODEL = getattr(settings, 'DJANGO_LEDGER_ITEM_MODEL', 'django_ledger.ItemModel')
148
+ # DJANGO_LEDGER_STAGED_TRANSACTION_MODEL = getattr(settings, 'DJANGO_LEDGER_STAGED_TRANSACTION_MODEL', 'django_ledger.StagedTransactionModel')
149
+ # DJANGO_LEDGER_IMPORT_JOB_MODEL = getattr(settings, 'DJANGO_LEDGER_IMPORT_JOB_MODEL', 'django_ledger.ImportJobModel')