docs: linked docs list

remotes/origin/mitri4
Andrey 9 years ago
parent eaed37e3bb
commit 895ed84248
  1. 3
      project/docs/models/aktrabot.py
  2. 7
      project/docs/models/faktura.py
  3. 12
      project/docs/models/invoice.py
  4. 46
      project/docs/models/linked_docs_mixin.py
  5. 3
      project/docs/models/nakladn.py
  6. 1
      project/docs/views/aktrabot.py
  7. 6
      project/docs/views/base_views.py
  8. 1
      project/docs/views/faktura.py
  9. 2
      project/docs/views/invoice.py
  10. 1
      project/docs/views/nakladn.py
  11. 4
      project/templates/docs/_base/base_list.html
  12. 4
      project/templates/docs/_base/preview.html
  13. 12
      project/templates/docs/parts/linked_docs_list.html

@ -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'Акт выполненных работ'

@ -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)

@ -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'Счета'

@ -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

@ -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='')

@ -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'

@ -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,
}

@ -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'

@ -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'

@ -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'

@ -81,8 +81,8 @@
<div id="doc_panel_{{ obj.pk }}" class="doc-panel hidden" style="" data-docname='{{ padeji.imenit }} №{{ obj.docnum }} от {{ obj.doc_date }}'>
{% include "docs/parts/doc_actions.html" %}
{% if template_docs_list %}
{% include template_docs_list %}
{% if template_linked_docs_list %}
{% include template_linked_docs_list %}
{% endif %}
{% url url_prefix|add:'copy' id=obj.pk as url_copy %}

@ -24,8 +24,8 @@
<div id="doc_panel_{{ obj.pk }}" class="doc-panel" style="" data-redirect='{{ url_list }}' data-docname='{{ padeji.imenit }} №{{ obj.doc_num }} от {{ obj.doc_date }}'>
{% include "docs/parts/doc_actions.html" %}
{% if template_docs_list %}
{% include template_docs_list %}
{% if template_linked_docs_list %}
{% include template_linked_docs_list %}
{% endif %}
{% url url_prefix|add:'copy' id=obj.pk as url_copy %}

@ -1,16 +1,20 @@
{% if obj.docs_for_invoice %}
{% if obj.linked_docs %}
<div class="doc-panel-header">Связанные документы</div>
{% for akt in obj.docs_for_invoice.AktRabot %}
{% for invoice in obj.linked_docs.Invoice %}
<a href="{% url 'docs_invoice_img' invoice.id %}" class="doc">{{ invoice }}</a>
{% endfor %}
{% for akt in obj.linked_docs.AktRabot %}
<a href="{% url 'docs_aktrabot_img' akt.id %}" class="doc">{{ akt }}</a>
{% endfor %}
{% for nakladn in obj.docs_for_invoice.Nakladn %}
{% for nakladn in obj.linked_docs.Nakladn %}
<a href="{% url 'docs_nakladn_img' nakladn.id %}" class="doc">{{ nakladn }}</a>
{% endfor %}
{% for faktura in obj.docs_for_invoice.Faktura %}
{% for faktura in obj.linked_docs.Faktura %}
<a href="{% url 'docs_faktura_img' faktura.id %}" class="doc">{{ faktura }}</a>
{% endfor %}
Loading…
Cancel
Save