1
models.py
class Contract(TimeStampedModel):
customer = models.ForeignKey('customers.CustomerProfile')
template = models.ForeignKey('configurations.ContractTemplate')
product = models.OneToOneField('products.CustomerProduct')
signed_at = models.DateTimeField(_('Date signed'), blank=True, null=True)
cancelled_at = models.DateTimeField(_('Date cancelled'), blank=True,
null=True)
html_source = models.TextField(_('HTML source'), blank=True, null=True)
pdf_file = models.OneToOneField('documents.Meta', on_delete=models.SET_NULL,
blank=True, null=True)
is_signed = models.BooleanField(_('Is signed'), default=False)
is_cancelled = models.BooleanField(_('Is cancelled'), default=False)
signature_uuid = models.UUIDField(_('Signature UUID'), primary_key=False,
default=uuid.uuid4, editable=False)
signature_ip = models.GenericIPAddressField(_('Signature IP'), blank=True,
null=True)
...
def sign(self, ip):
from loanwolf.contracts.utils import render_html_contract, store_pdf_contract
self.html_source = render_html_contract(self.template, self.customer,
self.product)
store_pdf_contract(self)
self.signature_ip = ip
self.signed_at = datetime.datetime.now()
self.is_signed = True
self.save()
if self.request.state.is_signature:
self.request.sign()
return True
views.py
class ContractAsHtmlView(DetailView):
model = Contract
pk_url_kwarg = 'uuid'
def get_object(self, queryset=None):
try:
return self.model.objects.get(
signature_uuid=self.kwargs.get('uuid'))
except self.model.DoesNotExist:
return None
def render_to_response(self, context, **response_kwargs):
if self.request.GET.get('lang'):
lang = self.request.GET.get('lang')
else:
lang = translation.get_language_from_request(self.request)
if self.object.template.language == lang:
template = self.object.template
else:
try:
template = ContractTemplate.objects.get(
slug=self.object.template.slug, language=lang)
except ContractTemplate.DoesNotExist:
template = self.object.template
html = render_html_contract(
template, self.object.customer, self.object.product)
return HttpResponse(html)
def get_context_data(self, **kwargs):
import ipdb; ipdb.set_trace()
context = super(ContractAsHtmlView, self).get_context_data(**kwargs)
context.update({
'signature_ip': self.viewing_signature_ip,
})
@property
def viewing_signature_ip(self):
import ipdb; ipdb.set_trace()
contract = Contract.objects.get(pk=1)
if contract.sign == True:
return contract.signature_ip
在當下,sign()
方法返回一個布爾的說法較多,但它不能被觸發更多比一次。因此,我不能在我的view
和if contract.sign == True:
中使用該方法。無論如何,sign()
需要參數,它不是一個屬性。有沒有另一種方式撥打sign()
而不觸發它?我可以使用某種指示器或信號來做這種事嗎?不觸發我的方法不止一次
明確地說,sign()
在程序中的其他地方使用。我想對view_signature_ip()
方法說如果sign()
爲真,則返回contract.signature_ip
。
你的意思是你不能使用' {%if contract.sign%}'在你的模板中?在您的合同實例上調用sign()後,您可以檢查'contract.is_signed'屬性? – ACimander
@Odi不,我不能。你的第二個問題非常有趣。你可以多做一點關於'你可以檢查'contract.is_signed' attrbute'嗎?你能對此做出完整的答案嗎?此外,我不能使用'{%if contract.sign%}',因爲'sign'不是一個屬性 –