Нужно реализовать различные отношения между пользователями: друзья, коллеги, муж/жена и т.п.. Некоторые из них не требуют подтверждения с другой стороны (коллега, друг), а некоторые - требуют (муж/жена, сын/дочь).
Как реализовать это дело с админки - разобрался. Через сигналы. Но мне нужно всё это делать от пользователя, с фронта. То есть по клику на кнопку происходит запрос и дальше всё обрабатывается.
Можно ли как-то связь клик по кнопке и сигнал?
models.py
class RelationShip(models.Model):
creator = models.CharField(max_length=254) #инициатор
relation = models.CharField(max_length=254) #с кем установлена связь
type_of_relation = models.CharField(_('type_relation'), max_length=254)
class RelationshipRequest(models.Model):
RELATION_FRIEND = 'friend'
RELATION_HUSBAND = 'husband'
RELATION_WIFE = 'wife'
RELATION_COLLEAGUE = 'colleague'
...
RELATION_CHOICES = (
...
)
creator = models.ManyToManyField(User, related_name='creator') #инициатор
relation = models.ManyToManyField(User, related_name='relation') #с кем установливается связь
type_of_relation = models.CharField(_('type_relation'), max_length=254, choices=RELATION_CHOICES)
status = models.BooleanField(default=False) #Принять/отклонить
signals.py
@receiver(post_save, sender=RelationRequest)
def user_save(instance, created, update_fields, **kwargs):
not_approving_list = ['familliar', 'mate', 'friend', 'colleague']
if not created:
user = instance
try:
request_relation = RelationRequest.objects.filter(creator=user.creator).filter(status=True).first()
relation_ships = RelationShip.objects.filter(creator=user.creator)
for i in relation_ships:
if unicode(request_relation.creator) == i.creator and unicode(request_relation.relation) == i.relation and request_relation.type_of_relation == i.type_of_relation:
break
else:
RelationShip.objects.create(
creator = user,
relation = request_relation.relation,
type_of_relation = request_relation.type_of_relation,
)
except:
pass
elif created:
user = instance
try:
request_relation = RelationRequest.objects.filter(creator=user.creator).first()
relation_ships = RelationShip.objects.filter(creator=user.creator)
if request_relation.type_of_relation in not_approving_list:
for i in relation_ships:
if unicode(request_relation.creator) == i.creator and unicode(request_relation.relation) == i.relation and request_relation.type_of_relation == i.type_of_relation:
break
else:
RelationShip.objects.create(
creator = user,
relation = request_relation.relation,
type_of_relation = request_relation.type_of_relation,
)
request_relation.status = True
request_relation.save(update_fields=['status'])
else:
return
except:
pass
Да, этот сигнал можно и нужно улучшить, но это сейчас не главное.