我有兴趣为我的电子签名web应用程序实现以下要求。
现在,我的以下实现如下:
我不喜欢我的方法有以下几点:
签名后的合同id中。
我正在附加合同列表的最后JSON代码。它可以工作,但我希望有一个正确的模型结构:
{
"results": [
{
"id": 178,
"is_author": true,
"title": "ahhzhzh",
"message_to_all_recipients": null,
"contract_signing_status": "WAITING_FOR_ME",
"contract_signing_type": "SIMPLE",
"contract_signing_date": {
"start_date": "2010-09-04T14:15:22Z",
"end_date": "2010-09-04T14:15:22Z"
},
"recipients": [
{
"message": null,
"recipient_signing_status": "NOT_SIGNED",
"recipient_review_status": "NOT_REQUIRED",
"recipient_action": "SIGN",
"role": "ADMIN",
"email": "test2331@gmail.com"
},
{
"message": null,
"recipient_signing_status": "NOT_SIGNED",
"recipient_review_status": "NOT_REQUIRED",
"recipient_action": "SIGN",
"role": "BASE",
"email": "test2333@gmail.com"
}
]
},
{
"id": 179,
"is_author": true,
"title": "dhhdhd",
"message_to_all_recipients": null,
"contract_signing_status": "WAITING_FOR_ME",
"contract_signing_type": "SIMPLE",
"contract_signing_date": {
"start_date": "2010-09-04T14:15:22Z",
"end_date": "2010-09-04T14:15:22Z"
},
"recipients": [
{
"message": null,
"recipient_signing_status": "NOT_SIGNED",
"recipient_review_status": "NOT_REQUIRED",
"recipient_action": "SIGN",
"role": "ADMIN",
"email": "test123@gmail.com"
},
{
"message": null,
"recipient_signing_status": "NOT_SIGNED",
"recipient_review_status": "NOT_REQUIRED",
"recipient_action": "SIGN",
"role": "BASE",
"email": "test233@gmail.com"
}
]
},
]
}发布于 2021-03-24 21:43:19
一个M2M和两个ForeignKeys之间唯一的区别是直通表,但是让我们看看我是否理解。如果我们从以下模型开始:
class User(models.Model):
email = models.CharField(...)
...
class Contract(models.Model):
user = models.ForeignKey('User', ..., related_name='contracts')
...
class Signature(models.Model):
user = models.ForeignKey('User', ..., related_name='signatures')
contract = models.ForeignKey('User', ..., related_name='signatures')
is_signed = models.BooleanField(default=False)
...
class Event(models.Model):
user = models.ForeignKey('User', ..., related_name='events')
contract = models.ForeignKey('Contract', ..., related_name='events')
signature = models.ForeignKey('Signature', ..., related_name='events')
message = models.CharField(...)
... 现在我们可以做这样的事情:
# get a specific user:
user = User.objects.get(email=<email>)
# get all of the contracts they own:
users_contracts = user.contracts.all() # OR
users_contracts = Contract.objects.filter(user=user)
# get a specific contract:
contract = Contract.objects.get(id=<contract-id>)
# get all the signatures on a contract:
signatures_on_contract = contract.signatures.all() # OR
signatures_on_contract = Signature.objects.filter(contract=contract)
# get all the signatures for a user:
users_signatures = user.signatures.all()
# get all the contracts that the user signed:
users_signed_contracts = Contracts.objects.filter(
signatures__in = users_signatures,
signatures__is_signed = True
)
# get all the events on the contract:
events = contract.events.order_by('id')现在,我们的合同json看起来可以是:
// i.e.: contract with id 7:
{
'id' : 7,
'user' : {
'id' : 2,
'email' : 'some@email.com'
},
'signatures' : [
{
'id' : 3,
'user' : {
'id' : 2,
'email' : 'some@email.com'
},
'is_signed' : true
},
{
'user' : {
'id' : 4,
'email' : 'other@email.com'
},
'is_signed' : false
}
],
'events' : [
{
'id' : 6,
'user' : {
'id' : 2,
'email' : 'some@email.com'
},
'contract' : {
'id' : 7
},
'signature' : {
'id' : 3
},
'message' : 'signed contract 7'
}
]
}这里的Event模型可能过于限定,不需要它所拥有的所有ForeignKey关系,但是这样您可以灵活地创建json。
编辑
处理需要签署合同的用户:
# a list of emails:
emails = ['email@1.com', 'email@2.com', ...]
for email in emails:
# get or create a user:
user, created = User.objects.get_or_create(email=email)
# new user logic:
if created:
# set temp password
# redirect users to change password page before signing a doc (can be done elsewhere)
...
# existing user logic:
else:
...
# create signatures for each user, and add them to the contract:
signature = Signature.objects.create(user=user, contract=contract)
...编辑2
下面是使用DRF将请求限制到基于对象的Signature表的示例:
views.py
class SignatureViewSet(viewsets.ModelViewSet):
# override this method to limit access:
def get_queryset(self):
# superusers can access all items:
if self.request.user.is_superuser:
return self.queryset
# otherwise, users can only access their own signatures:
else:
return self.queryset.filter(user=self.request.user)https://stackoverflow.com/questions/66726368
复制相似问题