Merged Air51/dokumentor.ru into master

remotes/origin/mitri4
Air51 9 years ago
commit b30d09f5f5
  1. 139
      project/docs/filters.py
  2. 7
      project/docs/views/aktrabot.py
  3. 5
      project/docs/views/aktsverki.py
  4. 12
      project/docs/views/base_views.py
  5. 5
      project/docs/views/dover.py
  6. 8
      project/docs/views/faktura.py
  7. 7
      project/docs/views/invoice.py
  8. 5
      project/docs/views/nakladn.py
  9. 5
      project/docs/views/platejka.py
  10. 2
      requirements.txt

@ -5,7 +5,7 @@ import django_filters
from project.customer.models import Client from project.customer.models import Client
from .models import Invoice, Platejka from .models import Invoice
from . import consts from . import consts
@ -134,77 +134,68 @@ platej_type_choices = (
) )
class _BaseFilterSet(django_filters.FilterSet): class BaseDocsFilterSet(django_filters.FilterSet):
"""Базовый класс фильтров. """Базовый класс всех фильтров документов.
Классы фильтров строить через build_filterset_class ! Работает и без Meta.
""" """
class Meta:
model = None def __init__(self, request, *args, **kwargs):
super(BaseDocsFilterSet, self).__init__(*args, **kwargs)
def __init__(self, user, *args, **kwargs):
super(_BaseFilterSet, self).__init__(*args, **kwargs) self.request = request
self.form.label_suffix = ''
if 'client' in self.filters:
self.filters['client'].extra['queryset'] = Client.objects.get_all(self.request.user.profile)
def build_filterset_class(model, user, need_fields=None):
"""Строит и возвращает класс с набором фильтров для фильтрации документов.""" if 'invoice' in self.filters:
attrs = {} self.filters['invoice'].extra['queryset'] = Invoice.objects.get_all(self.request.user.profile)
fields = []
# сбросить у полей формы атрибут help_text
for f in need_fields: for field in self.form.fields.itervalues():
if f == 'doc_date': field.help_text = None
doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices,
widget=django_filters.widgets.LinkWidget)
attrs['doc_date'] = doc_date class InvoiceFilterSet(BaseDocsFilterSet):
fields.append('doc_date') paid_status = django_filters.ChoiceFilter(label=u'По оплате', choices=paid_status_choices, widget=django_filters.widgets.LinkWidget)
closed_status = django_filters.ChoiceFilter(label=u'По закрывающим документам', choices=closed_status_choices, widget=django_filters.widgets.LinkWidget)
elif f == 'client': client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=Client.objects.get_all(user.profile), doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
empty_label=u'все контрагенты')
attrs['client'] = client
fields.append('client') class AktRabotFilterSet(BaseDocsFilterSet):
signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, widget=django_filters.widgets.LinkWidget)
elif f == 'invoice': client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
invoice = django_filters.ModelChoiceFilter(label=u'По счёту', queryset=Invoice.objects.get_all(user.profile), invoice = django_filters.ModelChoiceFilter(label=u'По счёту', queryset=None, empty_label=u'все счета')
empty_label=u'все счета') doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
attrs['invoice'] = invoice
fields.append('invoice')
class NakladnFilterSet(BaseDocsFilterSet):
elif f == 'closed_status': signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, widget=django_filters.widgets.LinkWidget)
closed_status = django_filters.ChoiceFilter(label=u'По закрывающим документам', choices=closed_status_choices, client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
widget=django_filters.widgets.LinkWidget) invoice = django_filters.ModelChoiceFilter(label=u'По счёту', queryset=None, empty_label=u'все счета')
attrs['closed_status'] = closed_status doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
fields.append('closed_status')
elif f == 'paid_status': class FakturaFilterSet(BaseDocsFilterSet):
paid_status = django_filters.ChoiceFilter(label=u'По оплате', choices=paid_status_choices, signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, widget=django_filters.widgets.LinkWidget)
widget=django_filters.widgets.LinkWidget) client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
attrs['paid_status'] = paid_status invoice = django_filters.ModelChoiceFilter(label=u'По счёту', queryset=None, empty_label=u'все счета')
fields.append('paid_status') doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
elif f == 'signed_status':
signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, class AktSverkiFilterSet(BaseDocsFilterSet):
widget=django_filters.widgets.LinkWidget) signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, widget=django_filters.widgets.LinkWidget)
attrs['signed_status'] = signed_status client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
fields.append('signed_status') total_saldo = CustomChoiceFilter(label=u'По сальдо', options=total_saldo_choices, widget=django_filters.widgets.LinkWidget)
doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
elif f == 'total_saldo':
total_saldo = CustomChoiceFilter(label=u'По сальдо', options=total_saldo_choices,
widget=django_filters.widgets.LinkWidget) class DoverFilterSet(BaseDocsFilterSet):
attrs['total_saldo'] = total_saldo client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
fields.append('total_saldo') doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
elif f == 'platej_type':
platej_type = django_filters.ChoiceFilter(label=u'По типу', choices=platej_type_choices, class PlatejkaFilterSet(BaseDocsFilterSet):
widget=django_filters.widgets.LinkWidget) platej_type = django_filters.ChoiceFilter(label=u'По типу', choices=platej_type_choices, widget=django_filters.widgets.LinkWidget)
attrs['platej_type'] = platej_type client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=None, empty_label=u'все контрагенты')
fields.append('platej_type') doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, widget=django_filters.widgets.LinkWidget)
else:
raise NotImplementedError(u'Unknown field: "%s".' % f)
model_name = model.__name__.lower()
klass = type(model_name+'FilterSet', (_BaseFilterSet,), attrs)
klass.Meta.model = model
klass.Meta.fields = fields# + _BaseFilterSet.Meta.fields
return klass

@ -3,7 +3,8 @@ from decimal import Decimal
from ..models import AktRabot, AktRabotItem from ..models import AktRabot, AktRabotItem
from ..forms import AktRabotForm, AktRabotItemForm from ..forms import AktRabotForm, AktRabotItemForm
from .. import consts, utils from ..filters import AktRabotFilterSet
from .. import utils
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
from .mixins import AddByInvoiceMethodMixin from .mixins import AddByInvoiceMethodMixin
@ -19,9 +20,7 @@ class AktRabotViews(BaseItemsViews, AddByInvoiceMethodMixin):
ITEM_FORM_CLASS = AktRabotItemForm # форма табличной части документа ITEM_FORM_CLASS = AktRabotItemForm # форма табличной части документа
ITEM_FORM_PREFIX = 'aktrabot_items' # префикс формы табличной части ITEM_FORM_PREFIX = 'aktrabot_items' # префикс формы табличной части
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = AktRabotFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',)
# по какому полю суммировать табличную часть документа при показе списком # по какому полю суммировать табличную часть документа при показе списком
LIST_SUM_FIELD = 'aktrabot_items__total_price' LIST_SUM_FIELD = 'aktrabot_items__total_price'

@ -5,6 +5,7 @@ from project.customer.forms import ClientsListForm
from ..models import AktSverki, AktSverkiItem from ..models import AktSverki, AktSverkiItem
from ..forms import AktSverkiForm, AktSverkiItemForm from ..forms import AktSverkiForm, AktSverkiItemForm
from ..filters import AktSverkiFilterSet
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
@ -22,9 +23,7 @@ class AktSverkiViews(BaseItemsViews):
# поля, по которым можно сортировать список документов # поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name',) ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name',)
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = AktSverkiFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('signed_status', 'client', 'total_saldo', 'doc_date',)
# префикс именованных урлов этого типа документов, для передачи в шаблон # префикс именованных урлов этого типа документов, для передачи в шаблон
URL_PREFIX = 'docs_aktsverki_' URL_PREFIX = 'docs_aktsverki_'

@ -67,9 +67,7 @@ class BaseViews(object):
# поля, по которым можно сортировать список документов # поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum',) ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum',)
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = None # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('client', 'doc_date',)
# префикс именованных урлов документов данного типа, для передачи в шаблон # префикс именованных урлов документов данного типа, для передачи в шаблон
URL_PREFIX = '' URL_PREFIX = ''
@ -133,6 +131,7 @@ class BaseViews(object):
assert self.FORM_CLASS is not None, (u"%s.FORM_CLASS 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 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 (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): def set_redirects(self):
"""Куда редиректить после операции.""" """Куда редиректить после операции."""
@ -162,14 +161,9 @@ class BaseViews(object):
qs = qs.order_by('%s%s' % ((order_type == 'desc' and '-' or ''), order_field,)) qs = qs.order_by('%s%s' % ((order_type == 'desc' and '-' or ''), order_field,))
return qs return qs
def get_filters_class(self):
"""Возвращает класс с набором фильтров."""
return filters.build_filterset_class(self.MODEL, self.request.user, self.FILTER_FIELDS)
def get_filters(self, qs): def get_filters(self, qs):
"""Возвращает объект с набором фильтров.""" """Возвращает объект с набором фильтров."""
klass = self.get_filters_class() return self.FILTERSET_CLASS(self.request, data=self.request.GET, queryset=qs)
return klass(self.request.user, self.request.GET, qs)
def get_obj(self, id, only_form_fields=False): def get_obj(self, id, only_form_fields=False):
"""Объект документа или ошибка 404, если его нет в базе. """Объект документа или ошибка 404, если его нет в базе.

@ -5,6 +5,7 @@ from project.customer.forms import ClientsListForm
from ..models import Dover, DoverItem from ..models import Dover, DoverItem
from ..forms import DoverForm, DoverItemForm from ..forms import DoverForm, DoverItemForm
from ..filters import DoverFilterSet
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
@ -22,9 +23,7 @@ class DoverViews(BaseItemsViews):
# поля, по которым можно сортировать список документов # поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_num', 'doc_date', 'doc_expire_date', 'dover_name', 'client__name',) ORDER_FIELDS = ('doc_num', 'doc_date', 'doc_expire_date', 'dover_name', 'client__name',)
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = DoverFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('client', 'doc_date',)
# префикс именованных урлов этого типа документов, для передачи в шаблон # префикс именованных урлов этого типа документов, для передачи в шаблон
URL_PREFIX = 'docs_dover_' URL_PREFIX = 'docs_dover_'

@ -2,12 +2,10 @@
from decimal import Decimal from decimal import Decimal
from django.utils.text import wrap from django.utils.text import wrap
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
from django.forms.models import inlineformset_factory
from ..models import Faktura, FakturaItem from ..models import Faktura, FakturaItem
from ..forms import FakturaForm, FakturaItemForm from ..forms import FakturaForm, FakturaItemForm
from ..filters import FakturaFilterSet
from .. import utils from .. import utils
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
@ -24,9 +22,7 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin):
ITEM_FORM_CLASS = FakturaItemForm # форма табличной части документа ITEM_FORM_CLASS = FakturaItemForm # форма табличной части документа
ITEM_FORM_PREFIX = 'faktura_items' # префикс формы табличной части ITEM_FORM_PREFIX = 'faktura_items' # префикс формы табличной части
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = FakturaFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',)
# по какому полю суммировать табличную часть документа при показе списком # по какому полю суммировать табличную часть документа при показе списком
LIST_SUM_FIELD = 'faktura_items__total_price' LIST_SUM_FIELD = 'faktura_items__total_price'

@ -5,7 +5,8 @@ from project.customer.forms import ClientsListForm
from ..models import Invoice, InvoiceItem from ..models import Invoice, InvoiceItem
from ..forms import InvoiceForm, InvoiceItemForm from ..forms import InvoiceForm, InvoiceItemForm
from .. import consts, utils, filters from ..filters import InvoiceFilterSet
from .. import utils
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
@ -22,9 +23,7 @@ class InvoiceViews(BaseItemsViews):
ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum', 'paid_status', 'closed_status') ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum', 'paid_status', 'closed_status')
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = InvoiceFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('paid_status', 'closed_status', 'client', 'doc_date',)
# по какому полю суммировать табличную часть документа при показе списком # по какому полю суммировать табличную часть документа при показе списком
LIST_SUM_FIELD = 'invoice_items__total_price' LIST_SUM_FIELD = 'invoice_items__total_price'

@ -5,6 +5,7 @@ from django.utils.text import wrap
from ..models import Nakladn, NakladnItem from ..models import Nakladn, NakladnItem
from ..forms import NakladnForm, NakladnItemForm from ..forms import NakladnForm, NakladnItemForm
from ..filters import NakladnFilterSet
from .. import utils from .. import utils
from .base_views import BaseItemsViews from .base_views import BaseItemsViews
@ -21,9 +22,7 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin):
ITEM_FORM_CLASS = NakladnItemForm # форма табличной части документа ITEM_FORM_CLASS = NakladnItemForm # форма табличной части документа
ITEM_FORM_PREFIX = 'nakladn_items' # префикс формы табличной части ITEM_FORM_PREFIX = 'nakladn_items' # префикс формы табличной части
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = NakladnFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',)
# по какому полю суммировать табличную часть документа при показе списком # по какому полю суммировать табличную часть документа при показе списком
LIST_SUM_FIELD = 'nakladn_items__total_price' LIST_SUM_FIELD = 'nakladn_items__total_price'

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from ..models import Platejka from ..models import Platejka
from ..forms import PlatejkaForm from ..forms import PlatejkaForm
from ..filters import PlatejkaFilterSet
from .base_views import BaseViews from .base_views import BaseViews
@ -14,9 +15,7 @@ class PlatejkaViews(BaseViews):
# поля, по которым можно сортировать список документов # поля, по которым можно сортировать список документов
ORDER_FIELDS = ('doc_date', 'doc_num', 'doc_info', 'doc_total',) ORDER_FIELDS = ('doc_date', 'doc_num', 'doc_info', 'doc_total',)
# поля, по которым можно фильтровать список документов FILTERSET_CLASS = PlatejkaFilterSet # фильтры
# должны поддерживаться в docs.filters.build_filterset_class !
FILTER_FIELDS = ('platej_type', 'client', 'doc_date',)
# префикс именованных урлов этого типа документов, для передачи в шаблон # префикс именованных урлов этого типа документов, для передачи в шаблон
URL_PREFIX = 'docs_platejka_' URL_PREFIX = 'docs_platejka_'

@ -16,7 +16,7 @@ django-debug-toolbar==1.2.1
django-devserver==0.8.0 django-devserver==0.8.0
django-eml-email-backend==0.1 django-eml-email-backend==0.1
django-filer==0.9.9 django-filer==0.9.9
django-filter==0.7 django-filter==0.11.0
django-mptt==0.6.1 django-mptt==0.6.1
django-polymorphic==0.6.1 django-polymorphic==0.6.1
django-sekizai==0.7 django-sekizai==0.7

Loading…
Cancel
Save