django-ledger 0.5.6.3__py3-none-any.whl → 0.5.6.5__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.
- django_ledger/__init__.py +1 -1
- django_ledger/admin/coa.py +3 -3
- django_ledger/admin/entity.py +14 -0
- django_ledger/forms/account.py +14 -5
- django_ledger/forms/coa.py +1 -6
- django_ledger/io/roles.py +25 -9
- django_ledger/migrations/0015_remove_chartofaccountmodel_locked_and_more.py +22 -0
- django_ledger/models/accounts.py +9 -9
- django_ledger/models/coa.py +261 -50
- django_ledger/models/entity.py +43 -28
- django_ledger/templates/django_ledger/account/account_create.html +17 -11
- django_ledger/templates/django_ledger/account/account_list.html +12 -9
- django_ledger/templates/django_ledger/account/account_update.html +18 -16
- django_ledger/templates/django_ledger/account/tags/accounts_table.html +97 -93
- django_ledger/templates/django_ledger/chart_of_accounts/coa_list.html +17 -0
- django_ledger/templates/django_ledger/{code_of_accounts → chart_of_accounts}/coa_update.html +1 -4
- django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html +74 -0
- django_ledger/templates/django_ledger/invoice/invoice_list.html +91 -94
- django_ledger/templatetags/django_ledger.py +1 -1
- django_ledger/tests/base.py +23 -1
- django_ledger/tests/test_accounts.py +16 -0
- django_ledger/tests/test_chart_of_accounts.py +46 -0
- django_ledger/urls/account.py +18 -3
- django_ledger/urls/chart_of_accounts.py +21 -1
- django_ledger/views/account.py +59 -10
- django_ledger/views/coa.py +83 -9
- django_ledger/views/mixins.py +10 -5
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/METADATA +1 -1
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/RECORD +33 -28
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/AUTHORS.md +0 -0
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/LICENSE +0 -0
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/WHEEL +0 -0
- {django_ledger-0.5.6.3.dist-info → django_ledger-0.5.6.5.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from django_ledger.models import EntityModelValidationError, ChartOfAccountModel
|
|
2
|
+
from django_ledger.tests.base import DjangoLedgerBaseTest
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ChartOfAccountsTests(DjangoLedgerBaseTest):
|
|
6
|
+
|
|
7
|
+
def test_no_default_coa(self):
|
|
8
|
+
entity_model = self.create_entity_model()
|
|
9
|
+
self.assertFalse(entity_model.has_default_coa(), msg='New entities do not had default coa')
|
|
10
|
+
|
|
11
|
+
with self.assertRaises(EntityModelValidationError, msg='New entities do not have default coa'):
|
|
12
|
+
entity_model.get_default_coa()
|
|
13
|
+
|
|
14
|
+
self.assertEqual(entity_model.get_default_coa(raise_exception=False), None,
|
|
15
|
+
msg='No exception should be raised when raise_exception is False')
|
|
16
|
+
|
|
17
|
+
def test_set_default_coa(self):
|
|
18
|
+
entity_model = self.create_entity_model()
|
|
19
|
+
coa_model = entity_model.create_chart_of_accounts(coa_name='Now CoA For Testing', assign_as_default=False)
|
|
20
|
+
self.assertTrue(isinstance(coa_model, ChartOfAccountModel))
|
|
21
|
+
self.assertFalse(entity_model.has_default_coa())
|
|
22
|
+
|
|
23
|
+
def test_create_coa(self):
|
|
24
|
+
entity_model = self.create_entity_model()
|
|
25
|
+
coa_model = entity_model.create_chart_of_accounts(coa_name='Now CoA For Testing', assign_as_default=False)
|
|
26
|
+
|
|
27
|
+
account_model_qs = coa_model.accountmodel_set.all()
|
|
28
|
+
|
|
29
|
+
account_count = account_model_qs.count()
|
|
30
|
+
self.assertTrue(account_count, 7)
|
|
31
|
+
|
|
32
|
+
ROOT_ACCOUNT_CODES = [
|
|
33
|
+
'00000000', # root_account
|
|
34
|
+
'01000000', # asset account root
|
|
35
|
+
'02000000', # liability accounts root
|
|
36
|
+
'03000000', # capital accounts root
|
|
37
|
+
'04000000', # income accounts root
|
|
38
|
+
'05000000', # cogs accounts root
|
|
39
|
+
'06000000', # expenses accounts root
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
for account in account_model_qs:
|
|
43
|
+
self.assertTrue(account.code in ROOT_ACCOUNT_CODES)
|
|
44
|
+
|
|
45
|
+
# todo: cannot transact on root account
|
|
46
|
+
# todo: validate parent/child relationship...
|
django_ledger/urls/account.py
CHANGED
|
@@ -3,15 +3,30 @@ from django.urls import path
|
|
|
3
3
|
from django_ledger import views
|
|
4
4
|
|
|
5
5
|
urlpatterns = [
|
|
6
|
+
|
|
7
|
+
# NO COA SLUG USES DEFAULT COA....
|
|
8
|
+
path('<slug:entity_slug>/create/',
|
|
9
|
+
views.AccountModelCreateView.as_view(),
|
|
10
|
+
name='account-create'),
|
|
6
11
|
path('<slug:entity_slug>/list/',
|
|
7
12
|
views.AccountModelListView.as_view(),
|
|
8
13
|
name='account-list'),
|
|
9
14
|
path('<slug:entity_slug>/list/active/',
|
|
10
15
|
views.AccountModelListView.as_view(active_only=True),
|
|
11
16
|
name='account-list-active'),
|
|
12
|
-
|
|
17
|
+
|
|
18
|
+
# EXPLICIT COA...
|
|
19
|
+
path('<slug:entity_slug>/<slug:coa_slug>/create/',
|
|
13
20
|
views.AccountModelCreateView.as_view(),
|
|
14
|
-
name='account-create'),
|
|
21
|
+
name='account-create-coa'),
|
|
22
|
+
path('<slug:entity_slug>/<slug:coa_slug>/list/',
|
|
23
|
+
views.AccountModelListView.as_view(),
|
|
24
|
+
name='account-list-coa'),
|
|
25
|
+
path('<slug:entity_slug>/<slug:coa_slug>/list/active/',
|
|
26
|
+
views.AccountModelListView.as_view(active_only=True),
|
|
27
|
+
name='account-list-active-coa'),
|
|
28
|
+
|
|
29
|
+
# Account Transaction Detail....
|
|
15
30
|
path('<slug:entity_slug>/update/<uuid:account_pk>/',
|
|
16
31
|
views.AccountModelUpdateView.as_view(),
|
|
17
32
|
name='account-update'),
|
|
@@ -31,7 +46,7 @@ urlpatterns = [
|
|
|
31
46
|
views.AccountModelDateDetailView.as_view(),
|
|
32
47
|
name='account-detail-date'),
|
|
33
48
|
|
|
34
|
-
# Actions...
|
|
49
|
+
# Account Actions...
|
|
35
50
|
path('<slug:entity_slug>/action/<uuid:account_pk>/activate/',
|
|
36
51
|
views.AccountModelModelActionView.as_view(action_name='activate'),
|
|
37
52
|
name='account-action-activate'),
|
|
@@ -3,5 +3,25 @@ from django.urls import path
|
|
|
3
3
|
from django_ledger import views
|
|
4
4
|
|
|
5
5
|
urlpatterns = [
|
|
6
|
-
path('<slug:entity_slug
|
|
6
|
+
path('<slug:entity_slug>/list/',
|
|
7
|
+
views.ChartOfAccountModelListView.as_view(),
|
|
8
|
+
name='coa-list'),
|
|
9
|
+
path('<slug:entity_slug>/detail/<slug:coa_slug>/',
|
|
10
|
+
views.ChartOfAccountModelListView.as_view(),
|
|
11
|
+
name='coa-detail'),
|
|
12
|
+
path('<slug:entity_slug>/update/<slug:coa_slug>/',
|
|
13
|
+
views.ChartOfAccountModelUpdateView.as_view(),
|
|
14
|
+
name='coa-update'),
|
|
15
|
+
|
|
16
|
+
# ACTIONS....
|
|
17
|
+
path('<slug:entity_slug>/action/<slug:coa_slug>/mark-as-default/',
|
|
18
|
+
views.CharOfAccountModelActionView.as_view(action_name='mark_as_default'),
|
|
19
|
+
name='coa-action-mark-as-default'),
|
|
20
|
+
path('<slug:entity_slug>/action/<slug:coa_slug>/mark-as-active/',
|
|
21
|
+
views.CharOfAccountModelActionView.as_view(action_name='mark_as_active'),
|
|
22
|
+
name='coa-action-mark-as-active'),
|
|
23
|
+
path('<slug:entity_slug>/action/<slug:coa_slug>/mark-as-inactive/',
|
|
24
|
+
views.CharOfAccountModelActionView.as_view(action_name='mark_as_inactive'),
|
|
25
|
+
name='coa-action-mark-as-inactive'),
|
|
26
|
+
|
|
7
27
|
]
|
django_ledger/views/account.py
CHANGED
|
@@ -17,7 +17,7 @@ from django.views.generic.detail import SingleObjectMixin
|
|
|
17
17
|
|
|
18
18
|
from django_ledger.forms.account import AccountModelUpdateForm, AccountModelCreateForm
|
|
19
19
|
from django_ledger.io.io_core import get_localdate
|
|
20
|
-
from django_ledger.models import
|
|
20
|
+
from django_ledger.models import ChartOfAccountModel
|
|
21
21
|
from django_ledger.models.accounts import AccountModel
|
|
22
22
|
from django_ledger.views.mixins import (
|
|
23
23
|
YearlyReportMixIn, MonthlyReportMixIn, QuarterlyReportMixIn, DjangoLedgerSecurityMixIn,
|
|
@@ -27,16 +27,53 @@ from django_ledger.views.mixins import (
|
|
|
27
27
|
|
|
28
28
|
class BaseAccountModelViewQuerySetMixIn:
|
|
29
29
|
queryset = None
|
|
30
|
+
coa_model = None
|
|
31
|
+
|
|
32
|
+
def get_coa_model(self) -> ChartOfAccountModel:
|
|
33
|
+
if self.coa_model is None:
|
|
34
|
+
coa_slug = self.kwargs.get('coa_slug')
|
|
35
|
+
if coa_slug:
|
|
36
|
+
coa_model_qs = self.AUTHORIZED_ENTITY_MODEL.chartofaccountmodel_set.all().active()
|
|
37
|
+
coa_model = get_object_or_404(coa_model_qs, slug__exact=coa_slug)
|
|
38
|
+
else:
|
|
39
|
+
coa_model = self.AUTHORIZED_ENTITY_MODEL.default_coa
|
|
40
|
+
self.coa_model = coa_model
|
|
41
|
+
return self.coa_model
|
|
30
42
|
|
|
31
43
|
def get_queryset(self):
|
|
32
44
|
if self.queryset is None:
|
|
33
|
-
|
|
45
|
+
qs = AccountModel.objects.for_entity(
|
|
34
46
|
entity_slug=self.kwargs['entity_slug'],
|
|
35
47
|
user_model=self.request.user,
|
|
36
|
-
).select_related(
|
|
48
|
+
).select_related(
|
|
49
|
+
'coa_model',
|
|
50
|
+
'coa_model__entity'
|
|
51
|
+
).order_by(
|
|
37
52
|
'coa_model', 'role', 'code').not_coa_root()
|
|
53
|
+
|
|
54
|
+
coa_slug = self.kwargs.get('coa_slug')
|
|
55
|
+
account_pk = self.kwargs.get('account_pk')
|
|
56
|
+
|
|
57
|
+
if coa_slug:
|
|
58
|
+
qs = qs.filter(coa_model__slug__exact=coa_slug)
|
|
59
|
+
elif account_pk:
|
|
60
|
+
qs = qs.filter(uuid__exact=account_pk)
|
|
61
|
+
else:
|
|
62
|
+
qs = qs.filter(coa_model__slug__exact=self.AUTHORIZED_ENTITY_MODEL.default_coa.slug)
|
|
63
|
+
|
|
64
|
+
self.queryset = qs
|
|
38
65
|
return super().get_queryset()
|
|
39
66
|
|
|
67
|
+
def get_context_data(self, *args, **kwargs):
|
|
68
|
+
context = super().get_context_data(*args, **kwargs)
|
|
69
|
+
entity_model = self.get_authorized_entity_instance()
|
|
70
|
+
if self.kwargs.get('coa_slug'):
|
|
71
|
+
coa_model_qs = entity_model.chartofaccountmodel_set.all()
|
|
72
|
+
context['coa_model'] = get_object_or_404(coa_model_qs, slug__exact=self.kwargs['coa_slug'])
|
|
73
|
+
else:
|
|
74
|
+
context['coa_model'] = entity_model.default_coa
|
|
75
|
+
return context
|
|
76
|
+
|
|
40
77
|
|
|
41
78
|
# Account Views ----
|
|
42
79
|
class AccountModelListView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuerySetMixIn, ListView):
|
|
@@ -75,7 +112,8 @@ class AccountModelUpdateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
|
|
|
75
112
|
# Set here because user_model is needed to instantiate an instance of MoveNodeForm (AccountModelUpdateForm)
|
|
76
113
|
account_model.USER_MODEL = self.request.user
|
|
77
114
|
return AccountModelUpdateForm(
|
|
78
|
-
|
|
115
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL,
|
|
116
|
+
coa_model=self.get_coa_model(),
|
|
79
117
|
user_model=self.request.user,
|
|
80
118
|
**self.get_form_kwargs()
|
|
81
119
|
)
|
|
@@ -101,25 +139,36 @@ class AccountModelCreateView(DjangoLedgerSecurityMixIn, BaseAccountModelViewQuer
|
|
|
101
139
|
def get_form(self, form_class=None):
|
|
102
140
|
return AccountModelCreateForm(
|
|
103
141
|
user_model=self.request.user,
|
|
104
|
-
|
|
142
|
+
entity_model=self.AUTHORIZED_ENTITY_MODEL,
|
|
143
|
+
coa_model=self.get_coa_model(),
|
|
105
144
|
**self.get_form_kwargs()
|
|
106
145
|
)
|
|
107
146
|
|
|
147
|
+
def get_context_data(self, *args, **kwargs):
|
|
148
|
+
context = super().get_context_data(*args, **kwargs)
|
|
149
|
+
context['header_subtitle'] = f'CoA: {context["coa_model"].name}'
|
|
150
|
+
return context
|
|
151
|
+
|
|
108
152
|
def form_valid(self, form):
|
|
109
|
-
|
|
110
|
-
entity_model_qs = EntityModel.objects.for_user(user_model=self.request.user).select_related('default_coa')
|
|
111
|
-
entity_model: EntityModel = get_object_or_404(entity_model_qs, slug__exact=self.kwargs['entity_slug'])
|
|
153
|
+
entity_model = self.AUTHORIZED_ENTITY_MODEL
|
|
112
154
|
account_model: AccountModel = form.save(commit=False)
|
|
113
155
|
|
|
114
156
|
if not entity_model.has_default_coa():
|
|
115
157
|
entity_model.create_chart_of_accounts(assign_as_default=True, commit=True)
|
|
116
158
|
|
|
117
|
-
coa_model =
|
|
118
|
-
coa_model.
|
|
159
|
+
coa_model = self.get_coa_model()
|
|
160
|
+
coa_model.allocate_account(account_model=account_model)
|
|
119
161
|
return HttpResponseRedirect(self.get_success_url())
|
|
120
162
|
|
|
121
163
|
def get_success_url(self):
|
|
122
164
|
entity_slug = self.kwargs.get('entity_slug')
|
|
165
|
+
coa_slug = self.kwargs.get('coa_slug')
|
|
166
|
+
if coa_slug:
|
|
167
|
+
return reverse('django_ledger:account-list-coa',
|
|
168
|
+
kwargs={
|
|
169
|
+
'entity_slug': entity_slug,
|
|
170
|
+
'coa_slug': coa_slug
|
|
171
|
+
})
|
|
123
172
|
return reverse('django_ledger:account-list',
|
|
124
173
|
kwargs={
|
|
125
174
|
'entity_slug': entity_slug,
|
django_ledger/views/coa.py
CHANGED
|
@@ -5,32 +5,70 @@ Copyright© EDMA Group Inc licensed under the GPLv3 Agreement.
|
|
|
5
5
|
Contributions to this module:
|
|
6
6
|
Miguel Sanda <msanda@arrobalytics.com>
|
|
7
7
|
"""
|
|
8
|
-
|
|
8
|
+
from django.contrib import messages
|
|
9
|
+
from django.core.exceptions import ImproperlyConfigured, ValidationError
|
|
10
|
+
from django.db.models import Count, Q
|
|
9
11
|
from django.urls import reverse
|
|
10
12
|
from django.utils.translation import gettext_lazy as _
|
|
11
|
-
from django.views.generic import UpdateView
|
|
13
|
+
from django.views.generic import UpdateView, ListView, RedirectView
|
|
14
|
+
from django.views.generic.detail import SingleObjectMixin
|
|
12
15
|
|
|
13
16
|
from django_ledger.forms.coa import ChartOfAccountsModelUpdateForm
|
|
14
17
|
from django_ledger.models.coa import ChartOfAccountModel
|
|
15
18
|
from django_ledger.views.mixins import DjangoLedgerSecurityMixIn
|
|
16
19
|
|
|
17
20
|
|
|
18
|
-
class
|
|
21
|
+
class ChartOfAccountModelModelBaseViewMixIn(DjangoLedgerSecurityMixIn):
|
|
19
22
|
queryset = None
|
|
20
23
|
|
|
21
24
|
def get_queryset(self):
|
|
22
25
|
if self.queryset is None:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
).select_related('entity')
|
|
26
|
+
entity_model = self.get_authorized_entity_instance()
|
|
27
|
+
self.queryset = entity_model.chartofaccountmodel_set.all().select_related(
|
|
28
|
+
'entity').order_by('-updated')
|
|
27
29
|
return super().get_queryset()
|
|
28
30
|
|
|
29
31
|
|
|
30
|
-
class
|
|
32
|
+
class ChartOfAccountModelListView(ChartOfAccountModelModelBaseViewMixIn, ListView):
|
|
33
|
+
template_name = 'django_ledger/chart_of_accounts/coa_list.html'
|
|
34
|
+
extra_context = {
|
|
35
|
+
'page_title': _('Chart of Account List'),
|
|
36
|
+
'header_title': _('Chart of Account List'),
|
|
37
|
+
}
|
|
38
|
+
context_object_name = 'coa_list'
|
|
39
|
+
|
|
40
|
+
def get_context_data(self, *, object_list=None, **kwargs):
|
|
41
|
+
context = super().get_context_data(object_list=None, **kwargs)
|
|
42
|
+
context['header_subtitle'] = self.AUTHORIZED_ENTITY_MODEL.name
|
|
43
|
+
context['header_subtitle_icon'] = 'gravity-ui:hierarchy'
|
|
44
|
+
return context
|
|
45
|
+
|
|
46
|
+
def get_queryset(self):
|
|
47
|
+
qs = super().get_queryset()
|
|
48
|
+
return qs.annotate(
|
|
49
|
+
accountmodel_total__count=Count(
|
|
50
|
+
'accountmodel',
|
|
51
|
+
# excludes coa root accounts...
|
|
52
|
+
filter=Q(accountmodel__depth__gt=2)
|
|
53
|
+
),
|
|
54
|
+
accountmodel_locked__count=Count(
|
|
55
|
+
'accountmodel',
|
|
56
|
+
# excludes coa root accounts...
|
|
57
|
+
filter=Q(accountmodel__depth__gt=2) & Q(accountmodel__locked=True)
|
|
58
|
+
),
|
|
59
|
+
accountmodel_active__count=Count(
|
|
60
|
+
'accountmodel',
|
|
61
|
+
# excludes coa root accounts...
|
|
62
|
+
filter=Q(accountmodel__depth__gt=2) & Q(accountmodel__active=True)
|
|
63
|
+
),
|
|
64
|
+
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class ChartOfAccountModelUpdateView(ChartOfAccountModelModelBaseViewMixIn, UpdateView):
|
|
31
69
|
context_object_name = 'coa'
|
|
32
70
|
slug_url_kwarg = 'coa_slug'
|
|
33
|
-
template_name = 'django_ledger/
|
|
71
|
+
template_name = 'django_ledger/chart_of_accounts/coa_update.html'
|
|
34
72
|
form_class = ChartOfAccountsModelUpdateForm
|
|
35
73
|
|
|
36
74
|
def get_context_data(self, **kwargs):
|
|
@@ -45,3 +83,39 @@ class ChartOfAccountsUpdateView(DjangoLedgerSecurityMixIn, ChartOfAccountsModelM
|
|
|
45
83
|
kwargs={
|
|
46
84
|
'entity_slug': entity_slug
|
|
47
85
|
})
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
# todo: centralize this functionality into a separate class for ALL Action views...
|
|
89
|
+
class CharOfAccountModelActionView(ChartOfAccountModelModelBaseViewMixIn,
|
|
90
|
+
RedirectView,
|
|
91
|
+
SingleObjectMixin):
|
|
92
|
+
http_method_names = ['get']
|
|
93
|
+
slug_url_kwarg = 'coa_slug'
|
|
94
|
+
action_name = None
|
|
95
|
+
commit = True
|
|
96
|
+
|
|
97
|
+
def get_redirect_url(self, *args, **kwargs):
|
|
98
|
+
return reverse('django_ledger:coa-list',
|
|
99
|
+
kwargs={
|
|
100
|
+
'entity_slug': kwargs['entity_slug']
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
def get(self, request, *args, **kwargs):
|
|
104
|
+
kwargs['user_model'] = self.request.user
|
|
105
|
+
if not self.action_name:
|
|
106
|
+
raise ImproperlyConfigured('View attribute action_name is required.')
|
|
107
|
+
response = super(CharOfAccountModelActionView, self).get(request, *args, **kwargs)
|
|
108
|
+
coa_model: ChartOfAccountModel = self.get_object()
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
getattr(coa_model, self.action_name)(commit=self.commit, **kwargs)
|
|
112
|
+
messages.add_message(request, level=messages.SUCCESS, extra_tags='is-success',
|
|
113
|
+
message=_('Successfully updated {} Default Chart of Account to '.format(
|
|
114
|
+
self.AUTHORIZED_ENTITY_MODEL.name) +
|
|
115
|
+
'{}'.format(coa_model.name)))
|
|
116
|
+
except ValidationError as e:
|
|
117
|
+
messages.add_message(request,
|
|
118
|
+
message=e.message,
|
|
119
|
+
level=messages.ERROR,
|
|
120
|
+
extra_tags='is-danger')
|
|
121
|
+
return response
|
django_ledger/views/mixins.py
CHANGED
|
@@ -299,11 +299,6 @@ class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
|
|
|
299
299
|
def get_login_url(self):
|
|
300
300
|
return reverse('django_ledger:login')
|
|
301
301
|
|
|
302
|
-
def get_authorized_entity_queryset(self):
|
|
303
|
-
return EntityModel.objects.for_user(
|
|
304
|
-
user_model=self.request.user).only(
|
|
305
|
-
'uuid', 'slug', 'name', 'default_coa', 'admin')
|
|
306
|
-
|
|
307
302
|
def has_permission(self):
|
|
308
303
|
if self.request.user.is_superuser:
|
|
309
304
|
if 'entity_slug' in self.kwargs:
|
|
@@ -326,6 +321,16 @@ class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
|
|
|
326
321
|
return True
|
|
327
322
|
return False
|
|
328
323
|
|
|
324
|
+
def get_authorized_entity_queryset(self):
|
|
325
|
+
return EntityModel.objects.for_user(
|
|
326
|
+
user_model=self.request.user).only(
|
|
327
|
+
'uuid', 'slug', 'name', 'default_coa', 'admin')
|
|
328
|
+
|
|
329
|
+
def get_authorized_entity_instance(self) -> Optional[EntityModel]:
|
|
330
|
+
if self.AUTHORIZED_ENTITY_MODEL is None:
|
|
331
|
+
raise Http404()
|
|
332
|
+
return self.AUTHORIZED_ENTITY_MODEL
|
|
333
|
+
|
|
329
334
|
|
|
330
335
|
class EntityUnitMixIn:
|
|
331
336
|
UNIT_SLUG_KWARG = 'unit_slug'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: django-ledger
|
|
3
|
-
Version: 0.5.6.
|
|
3
|
+
Version: 0.5.6.5
|
|
4
4
|
Summary: Bookkeeping & Financial analysis backend for Django. Balance Sheet, Income Statements, Chart of Accounts, Entities
|
|
5
5
|
Author-email: Miguel Sanda <msanda@arrobalytics.com>
|
|
6
6
|
Maintainer-email: Miguel Sanda <msanda@arrobalytics.com>
|
|
@@ -48,14 +48,14 @@ assets/node_modules/node-gyp/gyp/tools/pretty_gyp.py,sha256=2ZCRPW-MZfK7gdnCIaqh
|
|
|
48
48
|
assets/node_modules/node-gyp/gyp/tools/pretty_sln.py,sha256=b_Fxm-SXUCPL3Tix4EyNwZNmQ-zkeRIFFmuL0R5wFhw,5482
|
|
49
49
|
assets/node_modules/node-gyp/gyp/tools/pretty_vcproj.py,sha256=AwQrxK1F-jhjsbbT35XQjrvWNbc3IBFaKXoJogqMh_o,10633
|
|
50
50
|
assets/node_modules/node-gyp/test/fixtures/test-charmap.py,sha256=5raXzaQnO2eJnrlFtlDtWftryhZX7Fj0amFW3hdSnhE,547
|
|
51
|
-
django_ledger/__init__.py,sha256=
|
|
51
|
+
django_ledger/__init__.py,sha256=baak5-S_PQQ_AyoLijK86tI74pLFMsMbReoTxhab9ug,458
|
|
52
52
|
django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
|
|
53
53
|
django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
|
|
54
54
|
django_ledger/settings.py,sha256=KLujLYwEC3fxfj5u9HnVDsr1rBjE5OAI--bu0MYi4JE,6221
|
|
55
55
|
django_ledger/utils.py,sha256=l8xq-uSvUdJNpyDjC_0UrsSfjeEpwf7B-tavbnt40a8,4305
|
|
56
56
|
django_ledger/admin/__init__.py,sha256=MipzxmBhXswpx63uf3Ai2amyBMAP5fZL7mKXKxjNRIY,458
|
|
57
|
-
django_ledger/admin/coa.py,sha256=
|
|
58
|
-
django_ledger/admin/entity.py,sha256=
|
|
57
|
+
django_ledger/admin/coa.py,sha256=BcBsvNs4Z1hOyZy4YqCtIfk1aw8DejrI1bAEH93Tkjc,3542
|
|
58
|
+
django_ledger/admin/entity.py,sha256=DhH-6o3kjUdkhVPHzwOSF3crtvf5MCzcc1vPCk9O2Bk,6287
|
|
59
59
|
django_ledger/admin/ledger.py,sha256=ecwmnuW4119StZDR_1QaK9jdZXw2dEvza-dnx1bHWDM,7876
|
|
60
60
|
django_ledger/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
61
61
|
django_ledger/contrib/django_ledger_graphene/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -93,13 +93,13 @@ django_ledger/contrib/django_ledger_graphene/unit/schema.py,sha256=orR4tn1ORTfzL
|
|
|
93
93
|
django_ledger/contrib/django_ledger_graphene/vendor/mutations.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
94
|
django_ledger/contrib/django_ledger_graphene/vendor/schema.py,sha256=Y20FR0gut0yNsROL_f1LSHdzn7wM4_voKQv--evVGG4,1453
|
|
95
95
|
django_ledger/forms/__init__.py,sha256=N7iaeMO5xTU-q7RXTVYUy-fu8nMZbiIJ9QEtDCjsTdI,205
|
|
96
|
-
django_ledger/forms/account.py,sha256
|
|
96
|
+
django_ledger/forms/account.py,sha256=-U6OneNfH2bIlMzqXPZk8KmLn-csMhZ4PKzzq-4LdUs,5430
|
|
97
97
|
django_ledger/forms/app_filters.py,sha256=fHmftiuR1Ei28LhGuu7LoxS4Q5pVjj1wiT0fF4GUcUI,2293
|
|
98
98
|
django_ledger/forms/auth.py,sha256=HaJDEIRFoAHEAv-s_ZfTe0rZbhzIQ7GkKnaBX1qiAW4,736
|
|
99
99
|
django_ledger/forms/bank_account.py,sha256=dmmx1BzGq9IeD0jpYOmE83Gat6D3IUeTc0z0jJ7roR4,4513
|
|
100
100
|
django_ledger/forms/bill.py,sha256=aTAlMWtVA3eI-w0e9Vuxk2GSVey7pmAropPzrQ4OzcI,11007
|
|
101
101
|
django_ledger/forms/closing_entry.py,sha256=AwEEhphjQ-D4pQ6lRk2zGSmMSMkoamIVICnUY8rgqKU,1494
|
|
102
|
-
django_ledger/forms/coa.py,sha256
|
|
102
|
+
django_ledger/forms/coa.py,sha256=-w0GbVde1ve0lEgWCc7kAIfDDVP_nBYgrxykfC301Gw,1312
|
|
103
103
|
django_ledger/forms/customer.py,sha256=4Ce0J2d3hH5vfT1kdJbspUveIPEsRX_JktzIIu4rNks,2502
|
|
104
104
|
django_ledger/forms/data_import.py,sha256=6fAS-_kDm3wMgTyQx0SlrU8Cw_hLTsFrdJ76_thlUxY,5635
|
|
105
105
|
django_ledger/forms/entity.py,sha256=b0QirmsFSnaM8YWDO4V6GQXfFgR_MLmdq27I2q2sGQ0,6880
|
|
@@ -122,7 +122,7 @@ django_ledger/io/io_library.py,sha256=kZt61TV6McxH2Ly1INYRmb-T1hNuEKe4WI0YB_YHeK
|
|
|
122
122
|
django_ledger/io/io_middleware.py,sha256=3bMTjmBiwoXxyEo5ER-jZxWxT_xbcrtv4F__vJLsVXs,20096
|
|
123
123
|
django_ledger/io/ofx.py,sha256=JnmDjhIpLySoixK1WVe6DivRuu02rYsBjqI8yi5Opzs,1488
|
|
124
124
|
django_ledger/io/ratios.py,sha256=dsuCv9-r73SMLv3OrxeoT5JebfRmrDsRKG_YzHggWFw,3542
|
|
125
|
-
django_ledger/io/roles.py,sha256=
|
|
125
|
+
django_ledger/io/roles.py,sha256=RrErn0-cDOr90UrMBGl-PM_PxG2o_KYbGYeK4Dpwsek,20690
|
|
126
126
|
django_ledger/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
127
127
|
django_ledger/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
128
|
django_ledger/management/commands/generate_oauth2_codes.py,sha256=H92pSOMA0VFjdCLXOqdIWql-aKU12uaAPdXgz2DB9Go,1495
|
|
@@ -140,17 +140,18 @@ django_ledger/migrations/0011_importjobmodel_alter_accountmodel_role_and_more.py
|
|
|
140
140
|
django_ledger/migrations/0012_stagedtransactionmodel_activity.py,sha256=Tv0rXC1He6_lOVpv-RWT2tKoUTvJVSsM7T1SJR0qxcI,986
|
|
141
141
|
django_ledger/migrations/0013_stagedtransactionmodel_bundle_split.py,sha256=7Uxd5JEKbP31vSnlP1Us_JA6mtJzAwFnr0XNCKYJDao,469
|
|
142
142
|
django_ledger/migrations/0014_ledgermodel_ledger_xid_and_more.py,sha256=UHuEQrnFr1dV4p2mxeUtWk39psSnqwBymDz_xt57sZc,663
|
|
143
|
+
django_ledger/migrations/0015_remove_chartofaccountmodel_locked_and_more.py,sha256=GZDKJDjpqo52pY7sXusHpyvXsUwsuvoZqTQNda9Eo1I,560
|
|
143
144
|
django_ledger/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
144
145
|
django_ledger/models/__init__.py,sha256=8mn-OGhAVgLs8YASEBwo8dpX6tHyGtMxRHVPGDGECVU,793
|
|
145
|
-
django_ledger/models/accounts.py,sha256=
|
|
146
|
+
django_ledger/models/accounts.py,sha256=Ie5LTiT4zbmJndq1AJC6kZplgaklkXFusgl4LnIkIbQ,28687
|
|
146
147
|
django_ledger/models/bank_account.py,sha256=0-eTBxxRyvUKOVVNcGqWV1kiOKcXA2KPQIdiVHDUDCY,7678
|
|
147
148
|
django_ledger/models/bill.py,sha256=vaXdTEfow9SPzactNs6mZdm4tJc8uamKufT9tQGFpJg,63541
|
|
148
149
|
django_ledger/models/closing_entry.py,sha256=52BLvK4Jr8aXrB4kgFqrqHozkw13gwu0hm9RXWnLYE8,17732
|
|
149
|
-
django_ledger/models/coa.py,sha256=
|
|
150
|
+
django_ledger/models/coa.py,sha256=yxkZK6R8-j58i_KE8X1bB0CwnaF-Vhn0Z4qLK5ZycrY,20305
|
|
150
151
|
django_ledger/models/coa_default.py,sha256=4Zj8OMhgBiYuREjM82cFfyGWd8uCAeqggVkeNhg4SLU,27338
|
|
151
152
|
django_ledger/models/customer.py,sha256=JQOktcYKUlENJv4frek9rAW6sRerrQ0xXHlC5KPmhWk,11807
|
|
152
153
|
django_ledger/models/data_import.py,sha256=2H-4oTVLa7qXq03m9fd7T5zSQLkZKOAn2OAeOQBzMPA,19477
|
|
153
|
-
django_ledger/models/entity.py,sha256=
|
|
154
|
+
django_ledger/models/entity.py,sha256=zw8vJ-sjmFAPLcXWDwi60FaSa12QB6aEoCk0VzAo910,121191
|
|
154
155
|
django_ledger/models/estimate.py,sha256=-qB5t2cEdyYpFUq7tOUQnFqvE6EDUiVdTtzjEbESwEQ,55829
|
|
155
156
|
django_ledger/models/invoice.py,sha256=FZ7ZxAjyrM2NUwiR3wIX0PnbPXV27F63u8sESb4qM20,61389
|
|
156
157
|
django_ledger/models/items.py,sha256=JLPFGPQvTKiq3r09wgG2cxBB4ZmcEXK6LyqMUhzWj3k,54938
|
|
@@ -195,13 +196,13 @@ django_ledger/static/django_ledger/logo/django-ledger-text@2x.png,sha256=QJVyPER
|
|
|
195
196
|
django_ledger/static/django_ledger/logo/django-ledger-text@3x.png,sha256=ddWSMY9dXrAMPTS3LZ6K4sDVvJpYFW4KrVUTqJKU-wg,67707
|
|
196
197
|
django_ledger/static/django_ledger/logo/django-ledger-text@4x.png,sha256=d5hPUkvmJS_5LXPGgJ5VhcI_2CeteVsiNABv1Q2R6aw,99253
|
|
197
198
|
django_ledger/static/django_ledger/logo/favicon.png,sha256=7QIRzizQUig3PHi9zyV1tK8kXid410_mmin-WZ3zY4M,6434
|
|
198
|
-
django_ledger/templates/django_ledger/account/account_create.html,sha256=
|
|
199
|
+
django_ledger/templates/django_ledger/account/account_create.html,sha256=3-5LgVrvOm6YhryVGgtYltyHMA98dSNt7_vOvsxSRvU,1166
|
|
199
200
|
django_ledger/templates/django_ledger/account/account_create_child.html,sha256=i1tBc-N44D2mKnm61nrI11pXxo2STF1ezV9fVckB_qY,1089
|
|
200
201
|
django_ledger/templates/django_ledger/account/account_detail.html,sha256=m-UTWD9YqoM9JWKug4alY4DIql13jYFrJG2BmdYSZ7s,934
|
|
201
|
-
django_ledger/templates/django_ledger/account/account_list.html,sha256=
|
|
202
|
-
django_ledger/templates/django_ledger/account/account_update.html,sha256=
|
|
202
|
+
django_ledger/templates/django_ledger/account/account_list.html,sha256=0kDNrzcMgMewiBQGqjkPCUHErmOiVz6uy1FnwzclMjc,1019
|
|
203
|
+
django_ledger/templates/django_ledger/account/account_update.html,sha256=QR4kT3cv2d00Hlh0j6UUbhtAxJ6J_mQVzGDYCVDnaWE,1151
|
|
203
204
|
django_ledger/templates/django_ledger/account/tags/account_txs_table.html,sha256=ywGyB-LdCLAfT5vbFyTjPD7tNGwdQEZwrHq0Dtp6zoA,3373
|
|
204
|
-
django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=
|
|
205
|
+
django_ledger/templates/django_ledger/account/tags/accounts_table.html,sha256=33rqgVfnfi43l6u3JGOyydF0xH6QXNM2-QQqNK9Cnkg,7476
|
|
205
206
|
django_ledger/templates/django_ledger/auth/login.html,sha256=UYV2rxjEn9cXBbG6Ww93k6yMPJtOo5vpX6sod61ewKs,1849
|
|
206
207
|
django_ledger/templates/django_ledger/bank_account/bank_account_create.html,sha256=zoCvV-_2aBAXCnCfHTFI18Pn7hbEcOkgtcgYOQ2IJIg,1258
|
|
207
208
|
django_ledger/templates/django_ledger/bank_account/bank_account_list.html,sha256=FuwnbPZ8J6paQw02ddSYEpKUy97SKP-00mFDPMghgJI,701
|
|
@@ -216,6 +217,9 @@ django_ledger/templates/django_ledger/bills/bill_void.html,sha256=iQt9Nq1DL-Lovk
|
|
|
216
217
|
django_ledger/templates/django_ledger/bills/includes/card_bill.html,sha256=7bUT7Sx7oFHAs9ko1x3wBBhrOZnTAmrGR55S1vksm8g,14029
|
|
217
218
|
django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html,sha256=tmBNZoaHhk6EsCtcdqAQdHJ0XyDFaFRYqxdCf2Xi5KU,4082
|
|
218
219
|
django_ledger/templates/django_ledger/bills/tags/bill_table.html,sha256=aGy5iMUmlZ1D7L3qnQlOC2L8ScQCoLENEfBqHV-vJvE,2864
|
|
220
|
+
django_ledger/templates/django_ledger/chart_of_accounts/coa_list.html,sha256=v-g1zdj-0JT8FWUcvmfGgJUqpuIIsYoCciettI3UdgE,490
|
|
221
|
+
django_ledger/templates/django_ledger/chart_of_accounts/coa_update.html,sha256=S5RX0z_BGhCwdMuwjLWqWDihkKlhI2d3r_zgDfX1n9k,863
|
|
222
|
+
django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html,sha256=pWqa53tUwf2t0pR8tqu-8S0XMPz0dgw-JI0Rw0Tv66o,3166
|
|
219
223
|
django_ledger/templates/django_ledger/closing_entry/closing_entry_create.html,sha256=lBx2gKnKLT_12g-dJn1N6xmR_Nnk3Nm2kXjIK0PorMs,1338
|
|
220
224
|
django_ledger/templates/django_ledger/closing_entry/closing_entry_delete.html,sha256=4PzrIVBUnI6k7NBPiQto3TPM18T2jmTk5rZbx-RRqZo,1087
|
|
221
225
|
django_ledger/templates/django_ledger/closing_entry/closing_entry_detail.html,sha256=mnyVPRoQh9L6F5dB87ZfuoXjkreac9JRMK4cH6FUnqE,1599
|
|
@@ -224,7 +228,6 @@ django_ledger/templates/django_ledger/closing_entry/closing_entry_update.html,sh
|
|
|
224
228
|
django_ledger/templates/django_ledger/closing_entry/includes/card_closing_entry.html,sha256=qVmHjS2eKTwyuNl0zN9l4EWNjiJ1Y1lqLzTlVrY0T9U,3814
|
|
225
229
|
django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html,sha256=277jBIuib2yEA6eHF27DTMFizK8_MJ5QiqzwZ87c120,3109
|
|
226
230
|
django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_txs_table.html,sha256=Jdeh-d00htUIxcjFq52S1YcNCcwDfd4NIclti5Qoh6E,1212
|
|
227
|
-
django_ledger/templates/django_ledger/code_of_accounts/coa_update.html,sha256=ow9HaBcchzdNPtWlWKX4zuTuZqIZklyS2wxHJuqvUkQ,867
|
|
228
231
|
django_ledger/templates/django_ledger/components/activity_form.html,sha256=J9TNqRp1qKrxsFZKgX3ESK7r5QbjMQi4eE1D-0AOe9U,772
|
|
229
232
|
django_ledger/templates/django_ledger/components/breadcrumbs.html,sha256=hfaGk-MPGX8PZuhKRbkKaThshJmkJd_maGhMq7QgU10,1147
|
|
230
233
|
django_ledger/templates/django_ledger/components/chart_container.html,sha256=z0kaTfHYEwJGbQnNVZhCUPRg-sSeaW8HU-QWyoV3CnM,115
|
|
@@ -294,7 +297,7 @@ django_ledger/templates/django_ledger/inventory/tags/inventory_table.html,sha256
|
|
|
294
297
|
django_ledger/templates/django_ledger/invoice/invoice_create.html,sha256=p6I2SF-tW8Gq6vez_5jG1phudOjVqia6F-TNrTMM4_I,2125
|
|
295
298
|
django_ledger/templates/django_ledger/invoice/invoice_delete.html,sha256=qkhsW6lPiA4BxbWzHgncN8A6p8EU7MjjFyXZnQa1tF0,1482
|
|
296
299
|
django_ledger/templates/django_ledger/invoice/invoice_detail.html,sha256=tfJjGtMazJQlnLhvkd_NKdlcotm0Mogzo3B7piP9X7A,10547
|
|
297
|
-
django_ledger/templates/django_ledger/invoice/invoice_list.html,sha256=
|
|
300
|
+
django_ledger/templates/django_ledger/invoice/invoice_list.html,sha256=b5ysuDP-avrls4OSarSusySAKDFT1sM-jkQgWPPxpNw,5888
|
|
298
301
|
django_ledger/templates/django_ledger/invoice/invoice_update.html,sha256=cVuth_WbELKi3RWDrIKLcfDAe0RH3OV8N5AireHK298,8640
|
|
299
302
|
django_ledger/templates/django_ledger/invoice/includes/card_invoice.html,sha256=OHs3XcWxkYT6Sb4rQmNo_EiUVLksuj94AwG6PNtYaTY,13021
|
|
300
303
|
django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html,sha256=ba4J_WINrpYmCaHAyKWDKwZ6ETQXI3NkQ_AV6Y5-2uM,3413
|
|
@@ -350,11 +353,13 @@ django_ledger/templates/django_ledger/vendor/vendor_update.html,sha256=4kBUlGgrg
|
|
|
350
353
|
django_ledger/templates/django_ledger/vendor/includes/card_vendor.html,sha256=oCXyuqyF7CnJnDQdK0G0jdYLqtPWYSzwlv8oddyGJg8,1290
|
|
351
354
|
django_ledger/templates/django_ledger/vendor/tags/vendor_table.html,sha256=YC-3T5x4oua3VBg1q690CRzoogKL8qFgQRp5jTKLFgk,3400
|
|
352
355
|
django_ledger/templatetags/__init__.py,sha256=N7iaeMO5xTU-q7RXTVYUy-fu8nMZbiIJ9QEtDCjsTdI,205
|
|
353
|
-
django_ledger/templatetags/django_ledger.py,sha256=
|
|
356
|
+
django_ledger/templatetags/django_ledger.py,sha256=9lIsihiSJeu7zhdmbgwEaMfQ3c735CYmOv2Rpy-ELno,31693
|
|
354
357
|
django_ledger/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
355
|
-
django_ledger/tests/base.py,sha256=
|
|
358
|
+
django_ledger/tests/base.py,sha256=Be7BS_bc_m-hCTkBRnvHYfvAfgCcVOsU-He9ON6rOCc,10279
|
|
359
|
+
django_ledger/tests/test_accounts.py,sha256=WznTiYkxGcmeZ0W75ATpMsZGWrtmNV4voe4oLMCpveo,717
|
|
356
360
|
django_ledger/tests/test_auth.py,sha256=MP4mugLgL0wVFIID8NA0XiQVEtWsCUCCHQn_RsrMF3g,3028
|
|
357
361
|
django_ledger/tests/test_bill.py,sha256=K61HXbSbOpEfbi0Ia9JtCgLUfDb1MlEQcKmz47gm4Qw,18140
|
|
362
|
+
django_ledger/tests/test_chart_of_accounts.py,sha256=bTo7AXL_wAr_ywku_NwwxS6rgQyBLnJDxiGryhiDMWo,1952
|
|
358
363
|
django_ledger/tests/test_closing_entry.py,sha256=qrCmzGdXEY1MgbOiyAF1B18no-g6SN9XW_e7fgdJqlc,2540
|
|
359
364
|
django_ledger/tests/test_entity.py,sha256=do7YXRmd1vj2-q1PzC-Fhjr71dx3TqvxXWMiw9YhHaI,13450
|
|
360
365
|
django_ledger/tests/test_io.py,sha256=OLZnlC1vKCj226QHecn3q2aRSisy5YaHhTRT__jUNxk,7000
|
|
@@ -363,11 +368,11 @@ django_ledger/tests/test_transactions.py,sha256=qeIJr0q43IpI_9YrzjVcnltnk_7puGvd
|
|
|
363
368
|
django_ledger/tests/bdd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
364
369
|
django_ledger/tests/bdd/features/steps/README.py,sha256=4HMdVjjflcKQBf0LeZbc5i3TXbe5qGxYBcGmHn4i3jU,599
|
|
365
370
|
django_ledger/urls/__init__.py,sha256=98Dk0iQPeK2chSTY8H-7yuk9OycoUoZJdbpuR0Wv2rw,1994
|
|
366
|
-
django_ledger/urls/account.py,sha256=
|
|
371
|
+
django_ledger/urls/account.py,sha256=9G6m2mkki8sNtC_mlNIHcn2SCSoG7ienbQ5qg2kHWg0,2399
|
|
367
372
|
django_ledger/urls/auth.py,sha256=8dY2h6PQkMayUL81guu9JCxm--Tj0rglvvxg9Qh03aY,230
|
|
368
373
|
django_ledger/urls/bank_account.py,sha256=-dJsrnwej8H96Gc8xltLf3NwUxKk_xG0Mq4mxhe8Cqs,887
|
|
369
374
|
django_ledger/urls/bill.py,sha256=wvdRqSgnHp1CLdX6Sudu1IiIx4M1Pe8OupanA-9a-nI,2890
|
|
370
|
-
django_ledger/urls/chart_of_accounts.py,sha256=
|
|
375
|
+
django_ledger/urls/chart_of_accounts.py,sha256=c9b32U-GY8Ddhy2W7zW8IMnNtQzZHF1bs1SGJ4Ylr3U,1097
|
|
371
376
|
django_ledger/urls/closing_entry.py,sha256=3W0fCuAWGB3h8cWg0cxOb9EClVrydeIdHEX0q9rge60,1765
|
|
372
377
|
django_ledger/urls/customer.py,sha256=I3tWSb5Gmdr-boBSlCst_5cvCHz6JhpGxuwglqJeaG0,426
|
|
373
378
|
django_ledger/urls/data_import.py,sha256=bOi6U8gN2adxQUjOeNCJGuDRB--hwWeUIQOYTMbFarw,780
|
|
@@ -387,12 +392,12 @@ django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A9
|
|
|
387
392
|
django_ledger/urls/unit.py,sha256=EaBd1EcSeQYbOH1rTQZdyDEEtLVi7-QfC_wpRPwTpuE,1499
|
|
388
393
|
django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
|
|
389
394
|
django_ledger/views/__init__.py,sha256=l5Pm2_oAW6Q_jJbXf-BiHA3ilCbiGb6gkXCm73K5DGY,1158
|
|
390
|
-
django_ledger/views/account.py,sha256=
|
|
395
|
+
django_ledger/views/account.py,sha256=cT-YVWQCDj9IAaG8LVrk_jiH5gfGRrdzeZb63tR3atg,10525
|
|
391
396
|
django_ledger/views/auth.py,sha256=-zTjMlLpyxHGPlY9EXFQyeVHMmyeJ2H9RptcW7PDeDg,771
|
|
392
397
|
django_ledger/views/bank_account.py,sha256=bMgqrDydz6WuXina4L27uV-cmQicW0_JoPaXxlO7uN4,5176
|
|
393
398
|
django_ledger/views/bill.py,sha256=-WWAPF6PKqfaApAJBFwNMmIveDajXD-5a12d-LbcqFA,23087
|
|
394
399
|
django_ledger/views/closing_entry.py,sha256=y78azZesVgdUoQmaSEYiP7MBaPRE45qAAHPDlcThlUs,8103
|
|
395
|
-
django_ledger/views/coa.py,sha256=
|
|
400
|
+
django_ledger/views/coa.py,sha256=WnWQVz-4Ik9v28KHzD_WiKcgix7l6bBj1A60p4k-eos,4934
|
|
396
401
|
django_ledger/views/customer.py,sha256=RoBsXBxZC9b79DSNNHaoSZtQ2AoXf7DJAGmZEO3xdxs,3672
|
|
397
402
|
django_ledger/views/data_import.py,sha256=_H8gjGRIE2Jm97ivvEQn0uEWrM3VvKkYQeXQ1GbKn3g,11950
|
|
398
403
|
django_ledger/views/djl_api.py,sha256=6ADX9fBK8DroTeg8UIeCf2x4wt6-AF5xLlDQnqXBfsM,4411
|
|
@@ -406,14 +411,14 @@ django_ledger/views/invoice.py,sha256=iUzTG-EbdYqNX-eYwHBnQRUD_1wTOGutw0BfDMKcI6
|
|
|
406
411
|
django_ledger/views/item.py,sha256=FY53vk_giTRgvJ47FRqChQ8vyDYPDp4DGTvVhGAb36E,21347
|
|
407
412
|
django_ledger/views/journal_entry.py,sha256=21kuiRBlhlkgv8xZKM4mj9djv0Fu0BhB80QOEOHCa-w,12135
|
|
408
413
|
django_ledger/views/ledger.py,sha256=k3cK9zgGNnPwMPx0uqj_pRMFbM71lbYi7bi-l6B2M5s,12681
|
|
409
|
-
django_ledger/views/mixins.py,sha256=
|
|
414
|
+
django_ledger/views/mixins.py,sha256=Zgx85WJ87IQ0yTRdVgVQp70puWaRloUObLgqeCoQLTM,21283
|
|
410
415
|
django_ledger/views/purchase_order.py,sha256=1J3u4QnCkM7z1Y6DePijVdM67x4CQgfmQJcs3Y4kclU,21082
|
|
411
416
|
django_ledger/views/transactions.py,sha256=5taQRGLSMkM_N8paQJ07HMspI_Nl7PawF8OohCiRmao,206
|
|
412
417
|
django_ledger/views/unit.py,sha256=_RgPJO9mR6v5ohBXlnL3T8nTWgS1lwlCvERQcHk0wHE,10232
|
|
413
418
|
django_ledger/views/vendor.py,sha256=gUdBPTFLeSwlNfdHSA1KFdE_y3QpwpkFhEB0r3-UYdI,3461
|
|
414
|
-
django_ledger-0.5.6.
|
|
415
|
-
django_ledger-0.5.6.
|
|
416
|
-
django_ledger-0.5.6.
|
|
417
|
-
django_ledger-0.5.6.
|
|
418
|
-
django_ledger-0.5.6.
|
|
419
|
-
django_ledger-0.5.6.
|
|
419
|
+
django_ledger-0.5.6.5.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
|
|
420
|
+
django_ledger-0.5.6.5.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
|
|
421
|
+
django_ledger-0.5.6.5.dist-info/METADATA,sha256=1MQ9knc-wMCbM6T3EhgetV2sYIyQCzEeqfNOXntPqpM,12619
|
|
422
|
+
django_ledger-0.5.6.5.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
|
423
|
+
django_ledger-0.5.6.5.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
|
|
424
|
+
django_ledger-0.5.6.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|