orders.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. from rest_framework import serializers
  2. from dbsynce.models import Orders
  3. from tickets.models import Ticket, TicketList
  4. from dbsynce.lib.core import *
  5. from dbsynce.lib.ejabberd import *
  6. from core.settings_vars import DEBUG, WEBSERVICE_NAME, EJ_HOST, EJ_SERVICE
  7. import traceback
  8. import requests
  9. class OrdersSerializer(serializers.ModelSerializer):
  10. class Meta:
  11. model = Orders
  12. fields = '__all__'
  13. def create(self, validated_data):
  14. ModelClass = self.Meta.model
  15. if "ticket" not in validated_data:
  16. # Create ticket with minimal required data
  17. ticket_data = {
  18. "ticket_list": TicketList.objects.get(pk=9), # MS-SUP входящие обычные заявки ST_REQUEST
  19. "status": None,
  20. "created_date": "2000-01-01", # mandatory
  21. "status_changed_date": None,
  22. "created_by": None,
  23. "priority": 0, # default: 0
  24. "type": None,
  25. "title": "New ticket title", # mandatory
  26. "note": None,
  27. "due_date": None,
  28. "assigned_to": None,
  29. }
  30. ticket_instance = Ticket._default_manager.create(**ticket_data)
  31. validated_data["ticket"] = ticket_instance
  32. try:
  33. instance = ModelClass._default_manager.create(**validated_data)
  34. except TypeError:
  35. tb = traceback.format_exc()
  36. msg = (
  37. 'Got a `TypeError` when calling `%s.%s.create()`. '
  38. 'This may be because you have a writable field on the '
  39. 'serializer class that is not a valid argument to '
  40. '`%s.%s.create()`. You may need to make the field '
  41. 'read-only, or override the %s.create() method to handle '
  42. 'this correctly.\nOriginal exception was:\n %s' %
  43. (
  44. ModelClass.__name__,
  45. ModelClass._default_manager.name,
  46. ModelClass.__name__,
  47. ModelClass._default_manager.name,
  48. self.__class__.__name__,
  49. tb
  50. )
  51. )
  52. raise TypeError(msg)
  53. else:
  54. # FIXME: черновик, нужно возможно починить, дочинить переделать
  55. if DEBUG: print("[CREATING EJABBER ROOMS]")
  56. # Get neccessary data
  57. order_num = instance.pk
  58. support = choose_support()
  59. client = instance.client_id.user.phone_number
  60. provider = instance.provider.user_id.phone_number
  61. for room_name, room_members in get_rooms(WEBSERVICE_NAME, order_num, support, client, provider).items():
  62. # Create ejabber rooms
  63. data = {
  64. "name": room_name,
  65. "service": EJ_SERVICE,
  66. "host": EJ_HOST,
  67. }
  68. res = ej_execute("create_room", data)
  69. if DEBUG: print(f"[RESPONSE CREATED]: {res.json()}")
  70. if DEBUG: print(f"[ROOM]: {room_name}")
  71. # Set rooms to members_only
  72. data = {
  73. "name": room_name,
  74. "service": EJ_SERVICE,
  75. "option": "members_only",
  76. "value": "true"
  77. }
  78. res = ej_execute("change_room_option", data)
  79. if DEBUG: print(f"[SET ROOM TO MEMBERS ONLY]: {res.json()}")
  80. """
  81. Add members to the room
  82. member_account is a dict that contains members credentials
  83. Key - the same thing that is in room_members
  84. Value - tuple (jid, ejabber affiliation).
  85. Affiliation can be one of: owner, admin, member, outcast, none.
  86. owner > admin
  87. """
  88. members_accounts = {
  89. "owner": (WEBSERVICE_NAME + "_backend@" + EJ_HOST, "owner"),
  90. "client": (client, "member"),
  91. "support": (support, "member"),
  92. "provider": (provider, "member"),
  93. }
  94. data = {
  95. "name": room_name,
  96. "service": EJ_SERVICE,
  97. "jid": WEBSERVICE_NAME + "_backend@" + EJ_HOST,
  98. "affiliation": "owner"
  99. }
  100. # Add all neccessary member to the room
  101. for member in room_members:
  102. data["jid"] = members_accounts[member][0]
  103. data["affiliation"] = members_accounts[member][1]
  104. res = ej_execute("set_room_affiliation", data)
  105. if DEBUG: print(f"[ADDED USER]: {res.json()}")
  106. return instance