8
8
9
9
from django .contrib import messages
10
10
from django .core .exceptions import ValidationError , ImproperlyConfigured
11
- from django .db .models import Count
12
11
from django .http import HttpResponseRedirect
13
- from django .shortcuts import get_object_or_404
14
12
from django .urls import reverse
15
13
from django .utils .translation import gettext_lazy as _
16
- from django .views .generic import ArchiveIndexView , YearArchiveView , MonthArchiveView , DetailView , \
17
- RedirectView , CreateView , DeleteView , UpdateView
14
+ from django .views .generic import (
15
+ ArchiveIndexView , YearArchiveView ,
16
+ MonthArchiveView , DetailView ,
17
+ RedirectView , CreateView ,
18
+ DeleteView , UpdateView
19
+ )
18
20
from django .views .generic .detail import SingleObjectMixin
19
21
20
22
from django_ledger .forms .closing_entry import ClosingEntryCreateForm , ClosingEntryUpdateForm
24
26
from django_ledger .views import DjangoLedgerSecurityMixIn
25
27
26
28
27
- class ClosingEntryModelViewQuerySetMixIn :
29
+ class ClosingEntryModelBaseView ( DjangoLedgerSecurityMixIn ) :
28
30
queryset = None
29
- queryset_annotate_txs_count = False
30
31
31
32
def get_queryset (self ):
32
33
if self .queryset is None :
33
- qs = ClosingEntryModel .objects .for_entity (
34
- entity_slug = self .kwargs ['entity_slug' ],
35
- user_model = self .request .user
36
- ).select_related ('entity_model' , 'ledger_model' )
37
- if self .queryset_annotate_txs_count :
38
- qs = qs .annotate (ce_txs_count = Count ('closingentrytransactionmodel' ))
39
- self .queryset = qs
40
- return super ().get_queryset ()
41
-
42
-
43
- class ClosingEntryModelListView (DjangoLedgerSecurityMixIn ,
44
- ClosingEntryModelViewQuerySetMixIn ,
45
- ArchiveIndexView ):
34
+ entity_model : EntityModel = self .get_authorized_entity_instance ()
35
+ closing_entry_model_qs = entity_model .closingentrymodel_set .all ().select_related (
36
+ 'entity_model' ,
37
+ 'ledger_model'
38
+ ).order_by ('-closing_date' )
39
+ self .queryset = closing_entry_model_qs
40
+ return self .queryset
41
+
42
+
43
+ class ClosingEntryModelListView (ClosingEntryModelBaseView , ArchiveIndexView ):
46
44
template_name = 'django_ledger/closing_entry/closing_entry_list.html'
47
45
date_field = 'closing_date'
48
46
allow_future = False
@@ -56,23 +54,21 @@ class ClosingEntryModelListView(DjangoLedgerSecurityMixIn,
56
54
'header_title' : PAGE_TITLE ,
57
55
'header_subtitle_icon' : 'file-icons:finaldraft'
58
56
}
59
- queryset_annotate_txs_count = True
60
57
61
58
62
- class ClosingEntryModelYearListView (YearArchiveView , ClosingEntryModelListView ):
59
+ class ClosingEntryModelYearListView (ClosingEntryModelListView , YearArchiveView ):
63
60
paginate_by = 10
64
61
make_object_list = True
65
62
66
63
67
- class ClosingEntryModelMonthListView (MonthArchiveView , ClosingEntryModelListView ):
64
+ class ClosingEntryModelMonthListView (ClosingEntryModelListView , MonthArchiveView ):
68
65
paginate_by = 10
69
66
month_format = '%m'
70
67
date_list_period = 'year'
71
68
72
69
73
- class ClosingEntryModelCreateView (DjangoLedgerSecurityMixIn , ClosingEntryModelViewQuerySetMixIn , CreateView ):
70
+ class ClosingEntryModelCreateView (ClosingEntryModelBaseView , CreateView ):
74
71
template_name = 'django_ledger/closing_entry/closing_entry_create.html'
75
- form_class = ClosingEntryCreateForm
76
72
PAGE_TITLE = _ ('Create Closing Entry' )
77
73
extra_context = {
78
74
'page_title' : PAGE_TITLE ,
@@ -85,23 +81,25 @@ def get_initial(self):
85
81
'closing_date' : get_localdate ()
86
82
}
87
83
88
- def get_object (self , queryset = None ):
89
- if not getattr (self , 'object' ):
90
- entity_model_qs = EntityModel .objects .for_user (user_model = self .request .user )
91
- entity_model = get_object_or_404 (entity_model_qs , slug__exact = self .kwargs ['entity_slug' ])
92
- self .object = entity_model
93
- return self .object
84
+ def get_form (self , form_class = None , ** kwargs ):
85
+ return ClosingEntryCreateForm (
86
+ ** self .get_form_kwargs ()
87
+ )
94
88
95
89
def get_context_data (self , ** kwargs ):
96
90
ctx = super ().get_context_data (** kwargs )
97
- entity_model = self .get_object ()
91
+ entity_model : EntityModel = self .get_authorized_entity_instance ()
98
92
ctx ['header_subtitle' ] = entity_model .name
99
93
return ctx
100
94
101
95
def form_valid (self , form ):
102
96
closing_date = form .cleaned_data ['closing_date' ]
103
- entity_model : EntityModel = self .get_object ()
104
- ce_model , _ = entity_model .close_entity_books (closing_date = closing_date , force_update = True )
97
+ entity_model : EntityModel = self .get_authorized_entity_instance ()
98
+ ce_model , _ = entity_model .close_entity_books (
99
+ closing_date = closing_date ,
100
+ force_update = True ,
101
+ post_closing_entry = False
102
+ )
105
103
self .ce_model = ce_model
106
104
return HttpResponseRedirect (self .get_success_url ())
107
105
@@ -115,15 +113,14 @@ def get_success_url(self):
115
113
)
116
114
117
115
118
- class ClosingEntryModelDetailView (DjangoLedgerSecurityMixIn , ClosingEntryModelViewQuerySetMixIn , DetailView ):
116
+ class ClosingEntryModelDetailView (ClosingEntryModelBaseView , DetailView ):
119
117
template_name = 'django_ledger/closing_entry/closing_entry_detail.html'
120
118
pk_url_kwarg = 'closing_entry_pk'
121
119
context_object_name = 'closing_entry_model'
122
120
extra_context = {
123
121
'header_title' : 'Closing Entry Detail' ,
124
122
'header_subtitle_icon' : 'file-icons:finaldraft'
125
123
}
126
- queryset_annotate_txs_count = True
127
124
128
125
def get_context_data (self , ** kwargs ):
129
126
ctx = super ().get_context_data (** kwargs )
@@ -135,12 +132,11 @@ def get_context_data(self, **kwargs):
135
132
return ctx
136
133
137
134
138
- class ClosingEntryModelUpdateView (DjangoLedgerSecurityMixIn , ClosingEntryModelViewQuerySetMixIn , UpdateView ):
135
+ class ClosingEntryModelUpdateView (ClosingEntryModelBaseView , UpdateView ):
139
136
template_name = 'django_ledger/closing_entry/closing_entry_update.html'
140
137
pk_url_kwarg = 'closing_entry_pk'
141
138
form_class = ClosingEntryUpdateForm
142
139
context_object_name = 'closing_entry_model'
143
- queryset_annotate_txs_count = True
144
140
extra_context = {
145
141
'header_title' : 'Closing Entry Detail' ,
146
142
'header_subtitle_icon' : 'file-icons:finaldraft'
@@ -165,10 +161,22 @@ def get_success_url(self):
165
161
)
166
162
167
163
168
- class ClosingEntryDeleteView (DjangoLedgerSecurityMixIn , ClosingEntryModelViewQuerySetMixIn , DeleteView ):
164
+ class ClosingEntryDeleteView (ClosingEntryModelBaseView , DeleteView ):
169
165
template_name = 'django_ledger/closing_entry/closing_entry_delete.html'
170
166
pk_url_kwarg = 'closing_entry_pk'
171
167
context_object_name = 'closing_entry'
168
+ extra_context = {
169
+ 'header_title' : _ ('Delete Closing Entry' ),
170
+ 'header_subtitle_icon' : 'file-icons:finaldraft'
171
+ }
172
+
173
+ def get_context_data (self , ** kwargs ):
174
+ context = super ().get_context_data (** kwargs )
175
+ closing_entry_model : ClosingEntryModel = self .object
176
+ entity_model : EntityModel = self .get_authorized_entity_instance ()
177
+ context ['page_title' ] = 'Delete Closing Entry {}' .format (closing_entry_model .closing_date )
178
+ context ['header_subtitle' ] = entity_model .name
179
+ return context
172
180
173
181
def get_success_url (self ):
174
182
return reverse (viewname = 'django_ledger:closing-entry-list' ,
@@ -177,9 +185,8 @@ def get_success_url(self):
177
185
})
178
186
179
187
180
- class ClosingEntryModelActionView (DjangoLedgerSecurityMixIn ,
188
+ class ClosingEntryModelActionView (ClosingEntryModelBaseView ,
181
189
RedirectView ,
182
- ClosingEntryModelViewQuerySetMixIn ,
183
190
SingleObjectMixin ):
184
191
http_method_names = ['get' ]
185
192
pk_url_kwarg = 'closing_entry_pk'
0 commit comments