django-ledger 0.6.0.1__py3-none-any.whl → 0.6.1__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 (30) hide show
  1. assets/node_modules/node-gyp/update-gyp.py +0 -0
  2. django_ledger/__init__.py +1 -1
  3. django_ledger/admin/ledger.py +3 -1
  4. django_ledger/io/__init__.py +1 -3
  5. django_ledger/io/{io_digest.py → io_context.py} +8 -0
  6. django_ledger/io/io_core.py +19 -6
  7. django_ledger/io/io_library.py +79 -30
  8. django_ledger/io/roles.py +80 -86
  9. django_ledger/migrations/0016_remove_accountmodel_django_ledg_coa_mod_e19964_idx_and_more.py +44 -0
  10. django_ledger/models/accounts.py +73 -43
  11. django_ledger/models/bill.py +2 -0
  12. django_ledger/models/coa.py +2 -0
  13. django_ledger/models/entity.py +5 -3
  14. django_ledger/models/invoice.py +2 -1
  15. django_ledger/models/items.py +4 -2
  16. django_ledger/models/ledger.py +24 -12
  17. django_ledger/models/mixins.py +11 -7
  18. django_ledger/models/transactions.py +4 -35
  19. django_ledger/settings.py +1 -0
  20. django_ledger/urls/entity.py +1 -1
  21. django_ledger/urls/unit.py +1 -1
  22. django_ledger/views/entity.py +18 -12
  23. django_ledger/views/ledger.py +0 -1
  24. django_ledger/views/mixins.py +60 -30
  25. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/METADATA +10 -8
  26. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/RECORD +29 -28
  27. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/top_level.txt +1 -0
  28. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/AUTHORS.md +0 -0
  29. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/LICENSE +0 -0
  30. {django_ledger-0.6.0.1.dist-info → django_ledger-0.6.1.dist-info}/WHEEL +0 -0
@@ -10,8 +10,8 @@ from calendar import monthrange
10
10
  from datetime import timedelta, date
11
11
  from typing import Tuple, Optional
12
12
 
13
- from django.contrib.auth.mixins import PermissionRequiredMixin
14
- from django.core.exceptions import ValidationError, ObjectDoesNotExist
13
+ from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
14
+ from django.core.exceptions import ValidationError, ObjectDoesNotExist, ImproperlyConfigured
15
15
  from django.db.models import Q
16
16
  from django.http import Http404, HttpResponse, HttpResponseNotFound
17
17
  from django.urls import reverse
@@ -21,7 +21,7 @@ from django.views.generic.dates import YearMixin, MonthMixin, DayMixin
21
21
 
22
22
  from django_ledger.models import EntityModel, InvoiceModel, BillModel
23
23
  from django_ledger.models.entity import EntityModelFiscalPeriodMixIn
24
- from django_ledger.settings import DJANGO_LEDGER_PDF_SUPPORT_ENABLED
24
+ from django_ledger.settings import DJANGO_LEDGER_PDF_SUPPORT_ENABLED, DJANGO_LEDGER_AUTHORIZED_SUPERUSER
25
25
 
26
26
 
27
27
  class YearlyReportMixIn(YearMixin, EntityModelFiscalPeriodMixIn):
@@ -292,30 +292,40 @@ class SuccessUrlNextMixIn:
292
292
  return reverse('django_ledger:home')
293
293
 
294
294
 
295
- class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
295
+ class DjangoLedgerSecurityMixIn(LoginRequiredMixin, PermissionRequiredMixin):
296
+ ENTITY_SLUG_URL_KWARG = 'entity_slug'
296
297
  AUTHORIZED_ENTITY_MODEL: Optional[EntityModel] = None
298
+ AUTHORIZE_SUPERUSER: bool = DJANGO_LEDGER_AUTHORIZED_SUPERUSER
297
299
  permission_required = []
298
300
 
299
301
  def get_login_url(self):
300
302
  return reverse('django_ledger:login')
301
303
 
304
+ def get_entity_slug(self):
305
+ return self.kwargs[self.ENTITY_SLUG_URL_KWARG]
306
+
307
+ def get_entity_slug_kwarg(self):
308
+ if self.ENTITY_SLUG_URL_KWARG is None:
309
+ raise ImproperlyConfigured(
310
+ _('ENTITY_SLUG_URL_KWARG must be provided.')
311
+ )
312
+ return self.ENTITY_SLUG_URL_KWARG
313
+
314
+ def get_superuser_authorization(self):
315
+ return self.AUTHORIZE_SUPERUSER
316
+
302
317
  def has_permission(self):
303
- if self.request.user.is_superuser:
304
- if 'entity_slug' in self.kwargs:
305
- try:
306
- entity_model_qs = self.get_authorized_entity_queryset()
307
- self.AUTHORIZED_ENTITY_MODEL = entity_model_qs.get(slug__exact=self.kwargs['entity_slug'])
308
- except ObjectDoesNotExist:
309
- return False
310
- return True
311
- elif self.request.user.is_authenticated:
312
- has_perm = super().has_permission()
313
- if not has_perm:
314
- return False
315
- if 'entity_slug' in self.kwargs:
318
+ has_perm = super().has_permission()
319
+ if not has_perm:
320
+ return False
321
+
322
+ entity_slug_kwarg = self.get_entity_slug_kwarg()
323
+ entity_model_qs = self.get_authorized_entity_queryset()
324
+
325
+ if self.request.user.is_authenticated:
326
+ if entity_slug_kwarg in self.kwargs:
316
327
  try:
317
- entity_model_qs = self.get_authorized_entity_queryset()
318
- self.AUTHORIZED_ENTITY_MODEL = entity_model_qs.get(slug__exact=self.kwargs['entity_slug'])
328
+ self.AUTHORIZED_ENTITY_MODEL = entity_model_qs.get(slug__exact=self.kwargs[entity_slug_kwarg])
319
329
  except ObjectDoesNotExist:
320
330
  return False
321
331
  return True
@@ -323,7 +333,9 @@ class DjangoLedgerSecurityMixIn(PermissionRequiredMixin):
323
333
 
324
334
  def get_authorized_entity_queryset(self):
325
335
  return EntityModel.objects.for_user(
326
- user_model=self.request.user).only(
336
+ user_model=self.request.user,
337
+ authorized_superuser=self.get_superuser_authorization(),
338
+ ).only(
327
339
  'uuid', 'slug', 'name', 'default_coa', 'admin')
328
340
 
329
341
  def get_authorized_entity_instance(self) -> Optional[EntityModel]:
@@ -357,8 +369,26 @@ class EntityUnitMixIn:
357
369
 
358
370
 
359
371
  class DigestContextMixIn:
360
- IO_DIGEST = False
361
- IO_DIGEST_EQUITY = False
372
+ IO_DIGEST_UNBOUNDED = False
373
+ IO_DIGEST_BOUNDED = False
374
+
375
+ IO_DIGEST_UNBOUNDED_CONTEXT_NAME = 'tx_digest'
376
+ IO_MANAGER_UNBOUNDED_CONTEXT_NAME = 'tx_digest_context'
377
+
378
+ IO_DIGEST_BOUNDED_CONTEXT_NAME = 'equity_digest'
379
+ IO_MANAGER_BOUNDED_CONTEXT_NAME = 'equity_digest_context'
380
+
381
+ def get_io_digest_unbounded_context_name(self):
382
+ return self.IO_DIGEST_UNBOUNDED_CONTEXT_NAME
383
+
384
+ def get_io_manager_unbounded_context_name(self):
385
+ return self.IO_MANAGER_UNBOUNDED_CONTEXT_NAME
386
+
387
+ def get_io_digest_bounded_context_name(self):
388
+ return self.IO_DIGEST_BOUNDED_CONTEXT_NAME
389
+
390
+ def get_io_manager_bounded_context_name(self):
391
+ return self.IO_MANAGER_BOUNDED_CONTEXT_NAME
362
392
 
363
393
  def get_context_data(self, **kwargs):
364
394
  context = super(DigestContextMixIn, self).get_context_data(**kwargs)
@@ -370,8 +400,8 @@ class DigestContextMixIn:
370
400
  to_date=None,
371
401
  **kwargs):
372
402
 
373
- if any([self.IO_DIGEST,
374
- self.IO_DIGEST_EQUITY]):
403
+ if any([self.IO_DIGEST_UNBOUNDED,
404
+ self.IO_DIGEST_BOUNDED]):
375
405
 
376
406
  by_period = self.request.GET.get('by_period')
377
407
  entity_model: EntityModel = self.object
@@ -386,7 +416,7 @@ class DigestContextMixIn:
386
416
  else:
387
417
  unit_slug = None
388
418
 
389
- if self.IO_DIGEST:
419
+ if self.IO_DIGEST_UNBOUNDED:
390
420
  io_digest = entity_model.digest(user_model=self.request.user,
391
421
  to_date=to_date,
392
422
  unit_slug=unit_slug,
@@ -395,10 +425,10 @@ class DigestContextMixIn:
395
425
  process_roles=True,
396
426
  process_groups=True)
397
427
 
398
- context['tx_digest_context'] = io_digest
399
- context['tx_digest'] = io_digest.get_io_data()
428
+ context[self.get_io_manager_unbounded_context_name()] = io_digest
429
+ context[self.get_io_digest_unbounded_context_name()] = io_digest.get_io_data()
400
430
 
401
- if self.IO_DIGEST_EQUITY:
431
+ if self.IO_DIGEST_BOUNDED:
402
432
  io_digest_equity = entity_model.digest(user_model=self.request.user,
403
433
  equity_only=True,
404
434
  to_date=to_date,
@@ -409,8 +439,8 @@ class DigestContextMixIn:
409
439
  process_roles=False,
410
440
  process_groups=True)
411
441
 
412
- context['equity_digest_context'] = io_digest_equity
413
- context['equity_digest'] = io_digest_equity.get_io_data()
442
+ context[self.get_io_manager_bounded_context_name()] = io_digest_equity
443
+ context[self.get_io_digest_bounded_context_name()] = io_digest_equity.get_io_data()
414
444
 
415
445
  # todo: how is this used??....
416
446
  context['date_filter'] = to_date
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-ledger
3
- Version: 0.6.0.1
3
+ Version: 0.6.1
4
4
  Summary: Double entry accounting system built on the Django Web Framework.
5
5
  Author-email: Miguel Sanda <msanda@arrobalytics.com>
6
6
  Maintainer-email: Miguel Sanda <msanda@arrobalytics.com>
@@ -44,9 +44,10 @@ Requires-Dist: furo ; extra == 'dev'
44
44
 
45
45
  Introducing __Django Ledger__, a powerful double entry accounting system designed for financially driven applications
46
46
  using the [Django Web Framework](https://www.djangoproject.com). Developed by lead developer Miguel Sanda, this system
47
- offers a simplified, high-level API, making it easier for users to navigate the complexities of accounting. If you have
48
- prior experience with Django, you'll find this software even more effective. And, for those interested in contributing,
49
- consider joining our new discord channel for further collaboration and discussions.
47
+ offers a simplified, high-level API, making it easier for users to navigate the complexities of accounting.
48
+
49
+ If you have prior experience with Django, you'll find this software even more effective. And, for those interested
50
+ in contributing, consider joining our new discord channel for further collaboration and discussions.
50
51
 
51
52
  ### Questions? Join our Discord Channel [Here](https://discord.gg/c7PZcbYgrc)
52
53
 
@@ -82,13 +83,14 @@ Feel free to initiate an Issue describing your new feature request.
82
83
  Finance and Accounting is a complicated subject. Django Ledger stands out from other Django projects due to its focus
83
84
  on providing a developer-friendly accounting engine and a reliable, extensible API for financially driven applications.
84
85
  The project requires expertise in Python, Django programming, finance, and accounting. In essence, the project is
85
- seeking assistance from individuals with the specific skill set needed to contribute effectively. So, it's clear that
86
- they are in need of support from individuals with the right expertise.
86
+ seeking assistance from individuals with the specific skill set needed to contribute effectively.
87
87
 
88
88
  The project is actively seeking contributors with financial and/or accounting experience. Prior accounting experience
89
89
  is a big plus for potential contributors. If you have the relevant experience and want to contribute, feel free to
90
- reach out to me. You can find the contribution guidelines at the specified link. The project welcomes anyone interested
91
- in making a contribution.
90
+ reach out to me or submit your pull request.
91
+
92
+ You can find the contribution guidelines at the specified link.
93
+ The project welcomes anyone interested in making a contribution.
92
94
 
93
95
  See __[contribution guidelines](https://github.com/arrobalytics/django-ledger/blob/develop/Contribute.md)__.
94
96
 
@@ -48,15 +48,15 @@ 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=jnHCdsWYYamrH0NaMS2Fo0Mw33kRl-BEzEmJJxs6HAw,458
51
+ django_ledger/__init__.py,sha256=zjhbT65sw3hTpJoAXAnUS_CQxh530bsWRh9Lcro2CeQ,456
52
52
  django_ledger/apps.py,sha256=H-zEWUjKGakgSDSZmLIoXChZ2h6e0dth0ZO5SpoT-8U,163
53
53
  django_ledger/exceptions.py,sha256=rML8sQQ0Hq-DYMLZ76dfw2RYSAsXWUoyHuyC_yP9o1o,491
54
- django_ledger/settings.py,sha256=KLujLYwEC3fxfj5u9HnVDsr1rBjE5OAI--bu0MYi4JE,6221
54
+ django_ledger/settings.py,sha256=bZyPKgjmRcO_Rj7hDi4gGlW0VFr_LP2yKeUVIkmWgQM,6321
55
55
  django_ledger/utils.py,sha256=l8xq-uSvUdJNpyDjC_0UrsSfjeEpwf7B-tavbnt40a8,4305
56
56
  django_ledger/admin/__init__.py,sha256=MipzxmBhXswpx63uf3Ai2amyBMAP5fZL7mKXKxjNRIY,458
57
57
  django_ledger/admin/coa.py,sha256=BcBsvNs4Z1hOyZy4YqCtIfk1aw8DejrI1bAEH93Tkjc,3542
58
58
  django_ledger/admin/entity.py,sha256=DhH-6o3kjUdkhVPHzwOSF3crtvf5MCzcc1vPCk9O2Bk,6287
59
- django_ledger/admin/ledger.py,sha256=ecwmnuW4119StZDR_1QaK9jdZXw2dEvza-dnx1bHWDM,7876
59
+ django_ledger/admin/ledger.py,sha256=z33FYDT50ahrK4AGs-bZhnrvdIt-imG0QJpZ_KRGUWw,7914
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
62
62
  django_ledger/contrib/django_ledger_graphene/api.py,sha256=exrsmMcX21-Vhpe2_9X0eRLcdlnoE2ut0KUxBLu-TM8,871
@@ -114,15 +114,15 @@ django_ledger/forms/transactions.py,sha256=DD2TJthArTKTuzd4A43ZbugepcB8iuJ4Q_PSR
114
114
  django_ledger/forms/unit.py,sha256=rXUefjpuAmUU0vPOqu1ObO4k-bN-_Q6kOqHJ4kp_Vlg,1131
115
115
  django_ledger/forms/utils.py,sha256=sgkwBZs15_rZ5NT7h-8Z7wi3-ItM1E1sqoVDo3NQ5Jc,513
116
116
  django_ledger/forms/vendor.py,sha256=Nuh8MmSpz4ycMZwiVe--U9Ec6ezIsfACHDkhA2SyiZ4,2215
117
- django_ledger/io/__init__.py,sha256=Y9R-mY4peg8EpxmlXKaBER1IHMU-Nos8_dII41Kj0Ho,445
118
- django_ledger/io/io_core.py,sha256=fvMZYLlutL7Pn6F_p7U3whRA4ZeS7IDangm1v6Hcjvw,46479
119
- django_ledger/io/io_digest.py,sha256=W_bCH6JxGw6eASDb1k43JuGAejvOVfyA7WkCS7AEqDQ,4280
117
+ django_ledger/io/__init__.py,sha256=8m5AoBRiG2ymrX0Y4LVjq0275i7I5Sk7YRa1BTzVofI,369
118
+ django_ledger/io/io_context.py,sha256=xgykRoB6hVSN2q20f62j_4zbOeAHU5ZgbZaSwRaSkOU,4444
119
+ django_ledger/io/io_core.py,sha256=ktyTd_r6fZBSvGsXR-6J-vzwsdzAAyu3lnMWsVaFInk,46924
120
120
  django_ledger/io/io_generator.py,sha256=JF4plsABUkCIrtI2X-YD7o5eNghRIgLUseNcBIGOj3U,34613
121
- django_ledger/io/io_library.py,sha256=kZt61TV6McxH2Ly1INYRmb-T1hNuEKe4WI0YB_YHeKk,20564
121
+ django_ledger/io/io_library.py,sha256=vvQm3IQRLFdH7HS_DYX46Xe-U9IvgZ6MQnHjy0-fyjk,22480
122
122
  django_ledger/io/io_middleware.py,sha256=c-vwpcjg2HbYbb4O36fdf6011dFOnoNsDHOAQXmJgB8,20052
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=RrErn0-cDOr90UrMBGl-PM_PxG2o_KYbGYeK4Dpwsek,20690
125
+ django_ledger/io/roles.py,sha256=J9Z8WtunOQShKORCY97HpFtlAHG4N4hPfBkpUtRQDIY,20223
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
@@ -141,25 +141,26 @@ django_ledger/migrations/0012_stagedtransactionmodel_activity.py,sha256=Tv0rXC1H
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
143
  django_ledger/migrations/0015_remove_chartofaccountmodel_locked_and_more.py,sha256=GZDKJDjpqo52pY7sXusHpyvXsUwsuvoZqTQNda9Eo1I,560
144
+ django_ledger/migrations/0016_remove_accountmodel_django_ledg_coa_mod_e19964_idx_and_more.py,sha256=wpapkPycqZ9drUMlPGBs1IRy7pz6HyDgNvZBaf-E86o,1655
144
145
  django_ledger/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
146
  django_ledger/models/__init__.py,sha256=8mn-OGhAVgLs8YASEBwo8dpX6tHyGtMxRHVPGDGECVU,793
146
- django_ledger/models/accounts.py,sha256=GQoVBCN_UeXnA2zj4bejXthr2mmL9a_8iS-gDPKI5KY,28937
147
+ django_ledger/models/accounts.py,sha256=0OWMrv89fUdec7RF1EiWE6xZdJMOdEpgYPWechAJYrM,28881
147
148
  django_ledger/models/bank_account.py,sha256=0-eTBxxRyvUKOVVNcGqWV1kiOKcXA2KPQIdiVHDUDCY,7678
148
- django_ledger/models/bill.py,sha256=vaXdTEfow9SPzactNs6mZdm4tJc8uamKufT9tQGFpJg,63541
149
+ django_ledger/models/bill.py,sha256=ZC6PmPYeSFMUBSUqTqebQOZrWEpo59PH6Y4evTO5uy8,63717
149
150
  django_ledger/models/closing_entry.py,sha256=557vVKhrRZOdzqmmvtVlU48VbzJk8tTV018b0dTfpek,17746
150
- django_ledger/models/coa.py,sha256=Eue4XTRjM9irR-2z2P-Ynrw0ZrfAMub1m69mBdqok7s,27097
151
+ django_ledger/models/coa.py,sha256=o-VM2XK64djM3px6pJlGrUVTXu5qNb4ENESS70I___0,27154
151
152
  django_ledger/models/coa_default.py,sha256=4Zj8OMhgBiYuREjM82cFfyGWd8uCAeqggVkeNhg4SLU,27338
152
153
  django_ledger/models/customer.py,sha256=JQOktcYKUlENJv4frek9rAW6sRerrQ0xXHlC5KPmhWk,11807
153
154
  django_ledger/models/data_import.py,sha256=2H-4oTVLa7qXq03m9fd7T5zSQLkZKOAn2OAeOQBzMPA,19477
154
- django_ledger/models/entity.py,sha256=1btxPOJxKmSpT1T12bisVE_QVZmQoniyfpya1JURBt4,121692
155
+ django_ledger/models/entity.py,sha256=VFknz-7FQZu_gVDb5RWqPoCb3eXVzIMgmr4hatUlzBI,121876
155
156
  django_ledger/models/estimate.py,sha256=-qB5t2cEdyYpFUq7tOUQnFqvE6EDUiVdTtzjEbESwEQ,55829
156
- django_ledger/models/invoice.py,sha256=FZ7ZxAjyrM2NUwiR3wIX0PnbPXV27F63u8sESb4qM20,61389
157
- django_ledger/models/items.py,sha256=JLPFGPQvTKiq3r09wgG2cxBB4ZmcEXK6LyqMUhzWj3k,54938
157
+ django_ledger/models/invoice.py,sha256=h5Jh5KOfYr31Eu9gFW1mdoGoVzx7nW8qBdx7vyiXnZU,61568
158
+ django_ledger/models/items.py,sha256=Wh_zPBnYCdI393nHafT6xd4aSutKBQPwKSjDtXTTPNQ,55042
158
159
  django_ledger/models/journal_entry.py,sha256=VfXXvm3tUFuy2Z6j3PLlDk9ndHqsZgn_PuhrxTNqaiY,50918
159
- django_ledger/models/ledger.py,sha256=qjORKpXHn7d393OLS62F2joyyfZyh7tCg7wc67nAu50,23042
160
- django_ledger/models/mixins.py,sha256=SBcSMfFuFzLqFQv298aDOfAJrF5kT91oXyo384auKqc,51903
160
+ django_ledger/models/ledger.py,sha256=kPxyKo5u0-2viifCY87Ms3xglmgrfiDAg0oJgsOrDwc,23603
161
+ django_ledger/models/mixins.py,sha256=s8ZjEjYQfmU88cLyFNKoiFi79_g1rTe1knEccV2WUXw,52122
161
162
  django_ledger/models/purchase_order.py,sha256=CDibi90e7Yhpv_UiyP32mMcsQ0EUElXJ2r8pLzuS7yE,42729
162
- django_ledger/models/transactions.py,sha256=lCwJ68vPy2ePX8dTzDsEwHPk87VN-vYGdxfwSNF60Po,24229
163
+ django_ledger/models/transactions.py,sha256=kOL7s-hiRc6iqS7J62bVJY6ikja9Q8WdkRq0FT0zO2U,22722
163
164
  django_ledger/models/unit.py,sha256=x5FFJXgOi1OdajQejIakW6wGY4DjrJhL3S0Pm5OimMk,8074
164
165
  django_ledger/models/utils.py,sha256=3gkdCrfJp9qwN3Sf8R96AliilzwcKBm31UEao4WJO9o,8436
165
166
  django_ledger/models/vendor.py,sha256=akJCO86GIwjlZ_jPUZCDXlMeuJe-8zKTm-52aJXGFpg,11320
@@ -376,7 +377,7 @@ django_ledger/urls/closing_entry.py,sha256=3W0fCuAWGB3h8cWg0cxOb9EClVrydeIdHEX0q
376
377
  django_ledger/urls/customer.py,sha256=I3tWSb5Gmdr-boBSlCst_5cvCHz6JhpGxuwglqJeaG0,426
377
378
  django_ledger/urls/data_import.py,sha256=bOi6U8gN2adxQUjOeNCJGuDRB--hwWeUIQOYTMbFarw,780
378
379
  django_ledger/urls/djl_api.py,sha256=4BOkWI8MyfJlHXRn21hL08KYF39j7Njd1l7FIxTcsuc,952
379
- django_ledger/urls/entity.py,sha256=OjTvKuwlqtZVdcnQbr1JcLk5imyop-0Fs-p1wqgqKPQ,1279
380
+ django_ledger/urls/entity.py,sha256=8ysVslj0KhzGeOZyfRMJW6SYROyGM_azwGxFkkG4ICQ,1286
380
381
  django_ledger/urls/estimate.py,sha256=4dmIv-IElYgl88HsEuwIYBr6XK4Dhbhtj09TmDa5H8k,2058
381
382
  django_ledger/urls/feedback.py,sha256=TY7UWFHHdN6teL6HiLibmjGCx4pXSijYZWaLt3L7-qs,273
382
383
  django_ledger/urls/financial_statement.py,sha256=frEM-gPH3r9QkkyqmpQc3xf5IdqoCAdVQ5PgjvHD_PU,8565
@@ -388,7 +389,7 @@ django_ledger/urls/journal_entry.py,sha256=sKuYtKDSaAVcW--iIe8GQecuVZ7wF6W3vOtgA
388
389
  django_ledger/urls/ledger.py,sha256=9OD7jvR3D3F6KY9RU-Hj6asvH4OiapQzvwaG3IS7haY,2801
389
390
  django_ledger/urls/purchase_order.py,sha256=iUNdzy8dcxkkmDAOt2fO4Up3e0pHDqZNSf9JOKbO4Wo,2388
390
391
  django_ledger/urls/transactions.py,sha256=e_x_z5qbkR6i7o8OWWdXshDiY_WVmu9WVhR9A96fnhI,80
391
- django_ledger/urls/unit.py,sha256=EaBd1EcSeQYbOH1rTQZdyDEEtLVi7-QfC_wpRPwTpuE,1499
392
+ django_ledger/urls/unit.py,sha256=QEVKrgcw2dqMaaXsUHfqYecTa5-iaPlS9smrYJ1QsgM,1506
392
393
  django_ledger/urls/vendor.py,sha256=ODHpAwe5lomluj8ZCqbMtugTeeRsv0Yo9SqkZEmfYaw,393
393
394
  django_ledger/views/__init__.py,sha256=l5Pm2_oAW6Q_jJbXf-BiHA3ilCbiGb6gkXCm73K5DGY,1158
394
395
  django_ledger/views/account.py,sha256=d2pzYXKPOF74hCD4ehsQ_WNFsgqyGXXekCh22gDawAM,10523
@@ -400,7 +401,7 @@ django_ledger/views/coa.py,sha256=WnWQVz-4Ik9v28KHzD_WiKcgix7l6bBj1A60p4k-eos,49
400
401
  django_ledger/views/customer.py,sha256=RoBsXBxZC9b79DSNNHaoSZtQ2AoXf7DJAGmZEO3xdxs,3672
401
402
  django_ledger/views/data_import.py,sha256=_H8gjGRIE2Jm97ivvEQn0uEWrM3VvKkYQeXQ1GbKn3g,11950
402
403
  django_ledger/views/djl_api.py,sha256=6ADX9fBK8DroTeg8UIeCf2x4wt6-AF5xLlDQnqXBfsM,4411
403
- django_ledger/views/entity.py,sha256=YCAcgzlg66pk8mYCnhnVHbkWkGFuYHkJ-Vy6H8ea9og,9422
404
+ django_ledger/views/entity.py,sha256=egJoB4-HAyzKd_5tZ8gOh8nxMKA09_Ds2H7elGt5_DE,9457
404
405
  django_ledger/views/estimate.py,sha256=ZFG0k2_nAV10EjO-p8yp7EVMa4x2qOcFSHl2xFpNDaM,12811
405
406
  django_ledger/views/feedback.py,sha256=qoIN44fJnblPx-pJFe5yYeO-dMqp-FReFZiyw0qQb_s,2460
406
407
  django_ledger/views/financial_statement.py,sha256=B4FE9qyBYs8tJvBJ1n9-7kR-pH2EJWn6SnjBdtbRfuE,7335
@@ -409,15 +410,15 @@ django_ledger/views/inventory.py,sha256=ZyCmrkdYLu-D7Fnt0if0-wW6-wSWMgK9EQivVATA
409
410
  django_ledger/views/invoice.py,sha256=iUzTG-EbdYqNX-eYwHBnQRUD_1wTOGutw0BfDMKcI6s,20304
410
411
  django_ledger/views/item.py,sha256=FY53vk_giTRgvJ47FRqChQ8vyDYPDp4DGTvVhGAb36E,21347
411
412
  django_ledger/views/journal_entry.py,sha256=21kuiRBlhlkgv8xZKM4mj9djv0Fu0BhB80QOEOHCa-w,12135
412
- django_ledger/views/ledger.py,sha256=k3cK9zgGNnPwMPx0uqj_pRMFbM71lbYi7bi-l6B2M5s,12681
413
- django_ledger/views/mixins.py,sha256=Zgx85WJ87IQ0yTRdVgVQp70puWaRloUObLgqeCoQLTM,21283
413
+ django_ledger/views/ledger.py,sha256=Yk6uDoYhJs5vf5JRqsy8n0nUNDEHk7NzjR1PglyqaAM,12647
414
+ django_ledger/views/mixins.py,sha256=0hbpYeXAXQd1PoHetJjBcpie2AYkS_8eteVLfszQFT4,22410
414
415
  django_ledger/views/purchase_order.py,sha256=1J3u4QnCkM7z1Y6DePijVdM67x4CQgfmQJcs3Y4kclU,21082
415
416
  django_ledger/views/transactions.py,sha256=5taQRGLSMkM_N8paQJ07HMspI_Nl7PawF8OohCiRmao,206
416
417
  django_ledger/views/unit.py,sha256=_RgPJO9mR6v5ohBXlnL3T8nTWgS1lwlCvERQcHk0wHE,10232
417
418
  django_ledger/views/vendor.py,sha256=gUdBPTFLeSwlNfdHSA1KFdE_y3QpwpkFhEB0r3-UYdI,3461
418
- django_ledger-0.6.0.1.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
419
- django_ledger-0.6.0.1.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
420
- django_ledger-0.6.0.1.dist-info/METADATA,sha256=OrUy7UxR0pq7BC-igJag8bYQi_LujihzrpEEvxBwnVM,9700
421
- django_ledger-0.6.0.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
422
- django_ledger-0.6.0.1.dist-info/top_level.txt,sha256=fmHWehb2HfoDncQ3eQtYzeYc-gJMywf6q_ZpKBjwzoQ,38
423
- django_ledger-0.6.0.1.dist-info/RECORD,,
419
+ django_ledger-0.6.1.dist-info/AUTHORS.md,sha256=SRM2cynD89ZfEsL09zrbUVeO17r9zE2ZM7y6ReMqVRo,713
420
+ django_ledger-0.6.1.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
421
+ django_ledger-0.6.1.dist-info/METADATA,sha256=eHzjHHjGze0fWBZszdinvMyE4tx-9EcYrzrGuDL2Yhg,9641
422
+ django_ledger-0.6.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
423
+ django_ledger-0.6.1.dist-info/top_level.txt,sha256=0U3SjF63ND36grQNWDONVe-T9-T07lFl5e6QkG7bR2E,44
424
+ django_ledger-0.6.1.dist-info/RECORD,,
@@ -2,3 +2,4 @@ assets
2
2
  django_ledger
3
3
  docs
4
4
  screenshots
5
+ tests