diff --git a/project/docs/models/aktrabot.py b/project/docs/models/aktrabot.py index cf4dcda..a674522 100644 --- a/project/docs/models/aktrabot.py +++ b/project/docs/models/aktrabot.py @@ -3,9 +3,10 @@ from django.db import models from .base_models import BaseInvoiceModel, BaseItemInvoiceModel from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin +from .linked_docs_mixin import LinkedDocsMixin -class AktRabot(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): +class AktRabot(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin, LinkedDocsMixin): """Акт выполн. работ.""" class Meta(BaseInvoiceModel.Meta): verbose_name = u'Акт выполненных работ' diff --git a/project/docs/models/faktura.py b/project/docs/models/faktura.py index 46ea786..e344c49 100644 --- a/project/docs/models/faktura.py +++ b/project/docs/models/faktura.py @@ -5,9 +5,10 @@ from project.customer.models import Client from .base_models import BaseInvoiceModel, BaseItemInvoiceModel from .refs import Currency, Country, Measure from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin +from .linked_docs_mixin import LinkedDocsMixin -class Faktura(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): +class Faktura(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin, LinkedDocsMixin): """Счёт-фактура""" doc_reason = models.CharField(u'Основание', max_length=256, blank=True, default='') fixes = models.BooleanField(u'Изменения', default=False) @@ -23,7 +24,7 @@ class Faktura(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): def get_consignor_and_address(self): """Отправитель и адрес - """ + """ if self.user_is_sender: return u'%s, %s' % (self.user.profile.get_company_name(), self.user.profile.address) @@ -34,7 +35,7 @@ class Faktura(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): def get_receiver_and_address(self): """Получатель и адрес - """ + """ if self.receiver: #return self.user return '%s, %s' % (self.receiver.name, self.receiver.address) diff --git a/project/docs/models/invoice.py b/project/docs/models/invoice.py index ab889b4..9126160 100644 --- a/project/docs/models/invoice.py +++ b/project/docs/models/invoice.py @@ -2,10 +2,11 @@ from django.db import models from .base_models import BaseInvoiceModel, BaseItemInvoiceModel +from .linked_docs_mixin import LinkedDocsMixin from .. import consts -class Invoice(BaseInvoiceModel): +class Invoice(BaseInvoiceModel, LinkedDocsMixin): """Счет.""" UNPAID = 1 PARTLY_PAID = 2 @@ -20,15 +21,6 @@ class Invoice(BaseInvoiceModel): paid_status = models.PositiveSmallIntegerField(u'Оплачен?', choices=PAID_CHOICES, default=UNPAID) closed_status = models.BooleanField(u'Закрыт?', choices=consts.BOOL_CHOICES, default=False) - def docs_for_invoice(self): - doc_list = ['Faktura', 'Nakladn', 'AktRabot', ] - client_docs = {} - for doc in doc_list: - docs = models.get_model('docs', doc).objects.filter(invoice=self) - if docs: - client_docs[doc] = docs - return client_docs - class Meta(BaseInvoiceModel.Meta): verbose_name = u'Счёт' verbose_name_plural = u'Счета' diff --git a/project/docs/models/linked_docs_mixin.py b/project/docs/models/linked_docs_mixin.py new file mode 100644 index 0000000..5023254 --- /dev/null +++ b/project/docs/models/linked_docs_mixin.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.core.exceptions import FieldError + + +class LinkedDocsMixin(models.Model): + """Mixin: добавляет метод для получения списка связанных документов.""" + LINKED_DOCS_MODELS = ('Invoice', 'Faktura', 'Nakladn', 'AktRabot',) + + class Meta: + abstract = True + + def linked_docs(self): + if getattr(self, '_cache_linked_docs', None) is None: + self._cache_linked_docs = {} + + model_name = self.__class__.__name__ # имя модели на инстансе которой вызвали метод linked_docs + + if model_name == 'Invoice': + invoice_id = self.id + + for doc in self.LINKED_DOCS_MODELS: + if doc != 'Invoice': + queryset = models.get_model('docs', doc).objects.filter(invoice=invoice_id) + + if queryset: + self._cache_linked_docs[doc] = queryset + + else: + invoice_id = getattr(self, 'invoice_id', None) + + if invoice_id: + for doc in self.LINKED_DOCS_MODELS: + doc_model = models.get_model('docs', doc) + + if doc != 'Invoice': + queryset = doc_model.objects.filter(invoice_id=invoice_id) + if model_name == doc: + queryset = queryset.exclude(id=self.id) + else: + queryset = doc_model.objects.filter(id=invoice_id) + + if queryset: + self._cache_linked_docs[doc] = queryset + + return self._cache_linked_docs diff --git a/project/docs/models/nakladn.py b/project/docs/models/nakladn.py index 9f5eba8..309416d 100644 --- a/project/docs/models/nakladn.py +++ b/project/docs/models/nakladn.py @@ -3,9 +3,10 @@ from django.db import models from .base_models import BaseInvoiceModel, BaseItemInvoiceModel from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin +from .linked_docs_mixin import LinkedDocsMixin -class Nakladn(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): +class Nakladn(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin, LinkedDocsMixin): """Накладная торг12.""" doc_reason = models.CharField(u'Основание', max_length=256, blank=True, default='') diff --git a/project/docs/views/aktrabot.py b/project/docs/views/aktrabot.py index 4b074e9..5f5adb9 100644 --- a/project/docs/views/aktrabot.py +++ b/project/docs/views/aktrabot.py @@ -36,6 +36,7 @@ class AktRabotViews(BaseItemsViews, AddByInvoiceMethodMixin): # пути к шаблонам TEMPLATE_LIST = 'docs/aktrabot/list.html' TEMPLATE_FORM = 'docs/aktrabot/form.html' + TEMPLATE_LINKED_DOCS_LIST = 'docs/parts/linked_docs_list.html' # для генерации pdf/xls PDF_TEMPLATE = 'docs/aktrabot/as_pdf.html' diff --git a/project/docs/views/base_views.py b/project/docs/views/base_views.py index 5734c3c..6bceefc 100644 --- a/project/docs/views/base_views.py +++ b/project/docs/views/base_views.py @@ -87,7 +87,7 @@ class BaseViews(object): TEMPLATE_IMG = 'docs/_base/preview.html' TEMPLATE_FORM_JS = 'docs/stub_js.html' TEMPLATE_CREATE_DOCS = '' - TEMPLATE_DOCS_LIST = '' + TEMPLATE_LINKED_DOCS_LIST = '' TEMPLATE_EMAIL = 'docs/email/base_email.html' TEMPLATE_EMAIL_FORM = 'docs/email/base_email_form.html' @@ -232,7 +232,7 @@ class BaseViews(object): 'obj_list_count_before_filtering': obj_list_count_before_filtering, 'email_form': email_form, 'template_create_docs': self.TEMPLATE_CREATE_DOCS, - 'template_docs_list': self.TEMPLATE_DOCS_LIST, + 'template_linked_docs_list': self.TEMPLATE_LINKED_DOCS_LIST, 'maybe_sign': self.MAYBE_SIGNED, } self.update_list_dict(dictionary) @@ -436,7 +436,7 @@ class BaseViews(object): 'padeji_mnoj': self.PADEJI_MNOJ, 'url_prefix': self.URL_PREFIX, 'template_create_docs': self.TEMPLATE_CREATE_DOCS, - 'template_docs_list': self.TEMPLATE_DOCS_LIST, + 'template_linked_docs_list': self.TEMPLATE_LINKED_DOCS_LIST, 'email_form': email_form, 'maybe_sign': self.MAYBE_SIGNED, } diff --git a/project/docs/views/faktura.py b/project/docs/views/faktura.py index 25ef582..8faab5b 100644 --- a/project/docs/views/faktura.py +++ b/project/docs/views/faktura.py @@ -41,6 +41,7 @@ class FakturaViews(BaseItemsViews, AddByInvoiceMethodMixin): # пути к шаблонам TEMPLATE_LIST = 'docs/faktura/list.html' TEMPLATE_FORM = 'docs/faktura/form.html' + TEMPLATE_LINKED_DOCS_LIST = 'docs/parts/linked_docs_list.html' # для генерации pdf/xls PDF_TEMPLATE = 'docs/faktura/as_pdf.html' diff --git a/project/docs/views/invoice.py b/project/docs/views/invoice.py index 56b4013..c83d335 100644 --- a/project/docs/views/invoice.py +++ b/project/docs/views/invoice.py @@ -40,7 +40,7 @@ class InvoiceViews(BaseItemsViews): TEMPLATE_LIST = 'docs/invoice/list.html' TEMPLATE_FORM = 'docs/invoice/form.html' TEMPLATE_CREATE_DOCS = 'docs/parts/invoice_create_docs.html' - TEMPLATE_DOCS_LIST = 'docs/parts/invoice_docs_list.html' + TEMPLATE_LINKED_DOCS_LIST = 'docs/parts/linked_docs_list.html' # для генерации pdf/xls PDF_TEMPLATE = 'docs/invoice/as_pdf.html' diff --git a/project/docs/views/nakladn.py b/project/docs/views/nakladn.py index 83f4404..27045cd 100644 --- a/project/docs/views/nakladn.py +++ b/project/docs/views/nakladn.py @@ -38,6 +38,7 @@ class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): # пути к шаблонам TEMPLATE_LIST = 'docs/nakladn/list.html' TEMPLATE_FORM = 'docs/nakladn/form.html' + TEMPLATE_LINKED_DOCS_LIST = 'docs/parts/linked_docs_list.html' # для генерации pdf/xls PDF_TEMPLATE = 'docs/nakladn/as_pdf.html' diff --git a/project/templates/docs/_base/base_list.html b/project/templates/docs/_base/base_list.html index 0b833c8..3a4d762 100644 --- a/project/templates/docs/_base/base_list.html +++ b/project/templates/docs/_base/base_list.html @@ -81,8 +81,8 @@