@ -59,20 +59,18 @@ class Ordering(object):
class BaseViews ( object ) :
""" Базовые views для простых документов (без табличной части). """
MODEL = None # модель документа
FORM_CLASS = None # форма документа
EMAIL_FORM_CLASS = EmailForm # форма создания и отправки email
# модель документа
MODEL = None
# форма документа
FORM_CLASS = None
# форма создания и отправки email
EMAIL_FORM_CLASS = EmailForm
# поля, по которым можно сортировать список документов
ORDER_FIELDS = ( ' doc_date ' , ' doc_num ' , ' client__name ' , ' doc_sum ' , )
FILTERSET_CLASS = None # фильтры
# фильтры
FILTERSET_CLASS = None
# префикс именованных урлов документов данного типа, для передачи в шаблон
URL_PREFIX = ' '
# именованные урлы операций
URL_LIST = ' '
URL_EDIT = ' '
@ -90,7 +88,8 @@ class BaseViews(object):
TEMPLATE_EMAIL = ' docs/email/base_email.html '
TEMPLATE_EMAIL_FORM = ' docs/email/base_email_form.html '
EMAIL_MSG_TEMPLATE = ' docs/email/email.txt ' # шаблон письма
# шаблон письма
EMAIL_MSG_TEMPLATE = ' docs/email/email.txt '
# для генерации pdf/xls
PDF_TEMPLATE = ' '
@ -127,12 +126,18 @@ class BaseViews(object):
def asserts ( self ) :
""" Проверить объект класса на типичные ошибки. """
assert self . request is not None , ( u " %s .request can ' t be None! " % self . __class__ . __name__ )
assert self . MODEL is not None , ( u " %s .MODEL can ' t be None! " % self . __class__ . __name__ )
assert self . FORM_CLASS is not None , ( u " %s .FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
assert self . EMAIL_FORM_CLASS is not None , ( u " %s .EMAIL_FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
assert ( isinstance ( self . ORDER_FIELDS , tuple ) or isinstance ( self . ORDER_FIELDS , list ) ) , ( u " %s .ORDER_FIELDS should be of tuple or list type! " % self . __class__ . __name__ )
assert self . FILTERSET_CLASS is not None , ( u " %s .FILTERSET_CLASS can ' t be None! " % self . __class__ . __name__ )
assert self . request is not None , \
( u " %s .request can ' t be None! " % self . __class__ . __name__ )
assert self . MODEL is not None , \
( u " %s .MODEL can ' t be None! " % self . __class__ . __name__ )
assert self . FORM_CLASS is not None , \
( u " %s .FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
assert self . EMAIL_FORM_CLASS is not None , \
( u " %s .EMAIL_FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
assert ( isinstance ( self . ORDER_FIELDS , tuple ) or isinstance ( self . ORDER_FIELDS , list ) ) , \
( u " %s .ORDER_FIELDS should be of tuple or list type! " % self . __class__ . __name__ )
assert self . FILTERSET_CLASS is not None , \
( u " %s .FILTERSET_CLASS can ' t be None! " % self . __class__ . __name__ )
def set_redirects ( self ) :
""" Куда редиректить после операции. """
@ -169,15 +174,18 @@ class BaseViews(object):
def get_obj ( self , id , only_form_fields = False ) :
""" Объект документа или ошибка 404, если его нет в базе.
Поведение когда флаг only_form_fields = True :
если в форме редактирования документа задан атрибут Meta . fields , то запрашивает только поля ,
перечисленные в нём . Иначе ( как и по умолчанию ) дампит вообще все поля , которые есть в модели .
если в форме редактирования документа задан атрибут Meta . fields ,
то запрашивает только поля ,
перечисленные в нём . Иначе ( как и по умолчанию ) дампит вообще все поля ,
которые есть в модели .
"""
if only_form_fields :
try :
fields_list = self . FORM_CLASS . Meta . fields
except AttributeError :
fields_list = [ ]
return get_object_or_404 ( self . MODEL . objects . values ( * fields_list ) , pk = id , user = self . request . user )
return get_object_or_404 ( self . MODEL . objects . values ( * fields_list ) ,
pk = id , user = self . request . user )
else :
return get_object_or_404 ( self . MODEL , pk = id , user = self . request . user )
@ -188,7 +196,10 @@ class BaseViews(object):
return self . FILENAME % ( obj . doc_num , client , )
def update_list_dict ( self , dictionary ) :
""" Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов. """
"""
Здесь можно изменить словарь параметров перед передачей его в
шаблон вывода списка документов .
"""
dictionary [ ' clients_form ' ] = ClientsListForm ( self . request . user )
dictionary [ ' invoices_form ' ] = InvoicesListForm ( self . request . user )
@ -200,7 +211,8 @@ class BaseViews(object):
# фильтрация списка
filters = self . get_filters ( obj_list )
obj_list_count_before_filtering = 0 # сколько записей было в списке до его фильтрации
# сколько записей было в списке до его фильтрации
obj_list_count_before_filtering = 0
if not filters . qs :
obj_list_count_before_filtering = obj_list . count ( )
obj_list = filters . qs
@ -245,8 +257,10 @@ class BaseViews(object):
@method_decorator ( license_required )
@method_decorator ( csrf_protect )
def add ( self , * args , * * kwargs ) :
""" Добавить документ.
Если при GET - запросе в kwargs передать initial , то создаст предзаполненный документ .
"""
Добавить документ .
Если при GET - запросе в kwargs передать initial ,
то создаст предзаполненный документ .
"""
raise_if_no_profile ( self . request )
@ -304,7 +318,8 @@ class BaseViews(object):
obj = self . get_obj ( kwargs [ ' id ' ] )
if self . request . method == ' POST ' :
form = self . FORM_CLASS ( self . request . user , data = self . request . POST , instance = obj )
form = self . FORM_CLASS ( self . request . user ,
data = self . request . POST , instance = obj )
if form . is_valid ( ) :
new_obj = form . save ( )
@ -490,7 +505,8 @@ class BaseViews(object):
attachments = [ ]
for f in files :
attachments . append ( ( smart_str ( Header ( f [ ' filename ' ] , ' cp1251 ' ) ) , f [ ' content ' ] , f [ ' mimetype ' ] ) )
attachments . append ( ( smart_str ( Header ( f [ ' filename ' ] , ' cp1251 ' ) ) ,
f [ ' content ' ] , f [ ' mimetype ' ] ) )
email = EmailMessage ( subject = subject , to = ( to , ) , body = email_body , attachments = attachments )
return email . send ( )
@ -615,8 +631,10 @@ class BaseItemsViews(BaseViews):
def asserts ( self ) :
""" Проверить объект класса на типичные ошибки. """
super ( BaseItemsViews , self ) . asserts ( )
assert self . ITEM_MODEL is not None , ( u " %s .ITEM_MODEL can ' t be None! " % self . __class__ . __name__ )
assert self . ITEM_FORM_CLASS is not None , ( u " %s .ITEM_FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
assert self . ITEM_MODEL is not None , \
( u " %s .ITEM_MODEL can ' t be None! " % self . __class__ . __name__ )
assert self . ITEM_FORM_CLASS is not None , \
( u " %s .ITEM_FORM_CLASS can ' t be None! " % self . __class__ . __name__ )
def set_item_formset_class ( self , extra_count = 2 ) :
""" Класс FormSet-а для табличной части документа. """
@ -649,7 +667,8 @@ class BaseItemsViews(BaseViews):
@method_decorator ( csrf_protect )
def add ( self , * args , initial_items = None , initial = None , * * kwargs ) :
""" Добавить документ.
Если при GET - запросе в kwargs передать initial и / или initial_items , то создаст предзаполненный документ .
Если при GET - запросе в kwargs передать initial и / или initial_items ,
то создаст предзаполненный документ .
"""
raise_if_no_profile ( self . request )
@ -664,7 +683,8 @@ class BaseItemsViews(BaseViews):
if self . request . method == ' POST ' :
form = self . FORM_CLASS ( self . request . user , data = self . request . POST )
formset = self . ITEM_FORMSET_CLASS ( self . request . POST or None , prefix = self . ITEM_FORM_PREFIX )
formset = self . ITEM_FORMSET_CLASS ( self . request . POST or None ,
prefix = self . ITEM_FORM_PREFIX )
receiver_choice = form . data . get ( ' receiver_group ' , None )
sender_choice = form . data . get ( ' sender_group ' , None )
@ -685,7 +705,8 @@ class BaseItemsViews(BaseViews):
item . save ( )
messages . success ( self . request , " Документ успешно сохранен " )
except DatabaseError :
messages . error ( self . request , " Ошибка базы данных. Пожалуйста, попробуйте снова " )
messages . error ( self . request , " Ошибка базы данных. "
" Пожалуйста, попробуйте снова " )
return redirect ( self . REDIRECT_AFTER_ADD )
else :
initial = initial or self . init_form ( )
@ -770,7 +791,8 @@ class BaseItemsViews(BaseViews):
else :
receiver_choice = ' nobody '
formset = self . ITEM_FORMSET_CLASS ( self . request . POST or None , prefix = self . ITEM_FORM_PREFIX , instance = obj )
formset = self . ITEM_FORMSET_CLASS ( self . request . POST or None ,
prefix = self . ITEM_FORM_PREFIX , instance = obj )
form = self . FORM_CLASS ( self . request . user , data = self . request . POST or None , instance = obj )
if form . is_valid ( ) and formset . is_valid ( ) :