2017-07-19 62 views
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()方法返回一個布爾的說法較多,但它不能被觸發更多比一次。因此,我不能在我的viewif contract.sign == True:中使用該方法。無論如何,sign()需要參數,它不是一個屬性。有沒有另一種方式撥打sign()而不觸發它?我可以使用某種指示器或信號來做這種事嗎?不觸發我的方法不止一次

明確地說,sign()在程序中的其他地方使用。我想對view_signature_ip()方法說如果sign()爲真,則返回contract.signature_ip

+0

你的意思是你不能使用' {%if contract.sign%}'在你的模板中?在您的合同實例上調用sign()後,您可以檢查'contract.is_signed'屬性? – ACimander

+0

@Odi不,我不能。你的第二個問題非常有趣。你可以多做一點關於'你可以檢查'contract.is_signed' attrbute'嗎?你能對此做出完整的答案嗎?此外,我不能使用'{%if contract.sign%}',因爲'sign'不是一個屬性 –

回答

1

好的,讓我們來看看。你有一個錯誤在你的財產的方法:

@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 

您覈對的方法定義,這始終是真實的;如果你想檢查對方法的結果),你必須把它叫做:if contract.sign() == True: - )

如果您想避免調用簽名,可以使用合同實例的is_signed屬性:if contract.is_signed

另一件事有關該方法的屬性:contract = Contract.objects.get(pk=1)是你訪問屬性稱爲每次,你可能想緩存在一個視圖屬性在合同的結果:

_signature_ip = None 

    @property 
    def viewing_signature_ip(self): 
     import ipdb; ipdb.set_trace() 
     if self._signature_ip is not None: 
      return self._signature_ip 

     contract = Contract.objects.get(pk=1) 

     self._signature_ip = contract.signature_ip if contract.is_signed else '' 
     return self._signature_ip 
相關問題