o365_copy.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from O365 import Account
  2. from O365.address_book import Contact
  3. client_id = "925f74dc-f96a-4718-9ca7-d6cc3fa43e1e"
  4. client_secret = "SMn8Q~rVUnbYEAtEZZ6jcQElOIU9tDQUgv1VwcRz"
  5. account = Account(
  6. (client_id, client_secret), auth_flow_type="credentials", tenant_id="2ad0dff5-07ce-4cc2-a852-99ce8b91c218"
  7. )
  8. mailboxes = [
  9. "winter@global-cube.net",
  10. "bedner@global-cube.net",
  11. "brandt@global-cube.net",
  12. # 'd.ankenbrand@global-cube.de',
  13. # 'gawliczek@global-cube.de',
  14. "m.geiss@global-cube.net",
  15. "matarrelli@global-cube.net",
  16. "winkler@global-cube.net",
  17. "karaca@global-cube.net",
  18. ]
  19. def copy_contact(p_from: Contact, p_to: Contact):
  20. p_to.display_name = p_from.display_name
  21. p_to.name = p_from.name
  22. p_to.surname = p_from.surname
  23. p_to.title = p_from.title
  24. p_to.job_title = p_from.job_title
  25. p_to.company_name = p_from.company_name
  26. p_to.department = p_from.department
  27. p_to.office_location = p_from.office_location
  28. p_to.business_phones = p_from.business_phones
  29. p_to.mobile_phone = p_from.mobile_phone
  30. p_to.home_phones = p_from.home_phones
  31. p_to.emails.clear()
  32. for rcp in p_from.emails:
  33. p_to.emails.add(rcp)
  34. p_to.business_address = p_from.business_address
  35. # p_to.home_address = p_from.home_address
  36. p_to.other_address = p_from.other_address
  37. p_to.categories = p_from.categories
  38. p_to.personal_notes = p_from.personal_notes
  39. p_to.save()
  40. def sync_contacts():
  41. account.authenticate()
  42. shared = account.address_book(resource="adressbuch@global-cube.net", address_book="personal")
  43. shared_contacts = {p.display_name: p for p in shared.get_contacts(limit=None)}
  44. delete_candidates = set()
  45. for mailbox in mailboxes:
  46. print(mailbox)
  47. personal = account.address_book(resource=mailbox, address_book="personal")
  48. personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)}
  49. extra_contacts = set(personal_contacts.keys()).difference(shared_contacts.keys())
  50. print(extra_contacts)
  51. if len(delete_candidates) == 0:
  52. delete_candidates = extra_contacts
  53. else:
  54. delete_candidates = delete_candidates.intersection(extra_contacts)
  55. # p.delete()
  56. for p_shared in shared_contacts.values():
  57. if p_shared.display_name not in personal_contacts:
  58. p_new = personal.new_contact()
  59. copy_contact(p_shared, p_new)
  60. else:
  61. p_existing = personal_contacts[p_shared.display_name]
  62. if p_existing.to_api_data() != p_shared.to_api_data():
  63. copy_contact(p_shared, p_existing)
  64. return delete_candidates
  65. def delete_contacts(delete_candidates):
  66. account.authenticate()
  67. for mailbox in mailboxes:
  68. print(mailbox)
  69. personal = account.address_book(resource=mailbox, address_book="personal")
  70. personal_contacts = {p.display_name: p for p in personal.get_contacts(limit=None)}
  71. selected_contacts = set(delete_candidates).intersection(personal_contacts.keys())
  72. print(selected_contacts)
  73. for c in selected_contacts:
  74. personal_contacts[c].delete()
  75. def normalize_phone_number(phone_number: str):
  76. if phone_number is None:
  77. return None
  78. if phone_number.startswith("0"):
  79. phone_number = "+49 " + phone_number[1:]
  80. for c in "()/?":
  81. phone_number = phone_number.replace(c, "")
  82. return phone_number.replace(" -", "-").replace("- ", "-").replace(" ", " ")
  83. def cleanup_contacts():
  84. account.authenticate()
  85. shared = account.address_book(resource="adressbuch@global-cube.net", address_book="personal")
  86. for p in shared.get_contacts(limit=None):
  87. business = [normalize_phone_number(no) for no in p.business_phones]
  88. if p.business_phones != business:
  89. p.business_phones = business
  90. home = [normalize_phone_number(no) for no in p.home_phones]
  91. if p.home_phones != home:
  92. p.home_phones = home
  93. mobile = normalize_phone_number(p.mobile_phone)
  94. if p.mobile_phone != mobile:
  95. p.mobile_phone = mobile
  96. p.save()
  97. if __name__ == "__main__":
  98. contacts = sync_contacts()
  99. if len(contacts) > 0:
  100. delete_contacts(contacts)
  101. # cleanup_contacts()