Return structured classic SF share perms and compact text suffix. Tree text uses a single ``default:`` blob (all default flags). JSON splits folder-user defaults vs default record rights: - user_permissions: MU / MR (default manage users / manage records) - record_permissions: C
(params, sf, *, include_uids=False)
| 2092 | |
| 2093 | |
| 2094 | def _classic_folder_share_data(params, sf, *, include_uids=False): |
| 2095 | """Return structured classic SF share perms and compact text suffix. |
| 2096 | |
| 2097 | Tree text uses a single ``default:`` blob (all default flags). |
| 2098 | JSON splits folder-user defaults vs default record rights: |
| 2099 | - user_permissions: MU / MR (default manage users / manage records) |
| 2100 | - record_permissions: CE / CS (default can-edit / can-share on records) |
| 2101 | Named people/teams remain under ``users`` / ``teams``. |
| 2102 | """ |
| 2103 | DEFAULT_USER_PERM_KEYS = { |
| 2104 | 'default_manage_users': 'MU', |
| 2105 | 'default_manage_user': 'MU', # legacy alias if present |
| 2106 | 'default_manage_records': 'MR', |
| 2107 | } |
| 2108 | RECORD_PERM_KEYS = { |
| 2109 | 'default_can_edit': 'CE', |
| 2110 | 'default_can_share': 'CS', |
| 2111 | } |
| 2112 | MEMBER_PERM_KEYS = { |
| 2113 | 'manage_users': 'MU', |
| 2114 | 'manage_records': 'MR', |
| 2115 | } |
| 2116 | |
| 2117 | sf = sf or {} |
| 2118 | user_permissions = [abbr for key, abbr in DEFAULT_USER_PERM_KEYS.items() if sf.get(key)] |
| 2119 | user_permissions = [a for a in ('MU', 'MR') if a in user_permissions] |
| 2120 | record_permissions = [abbr for key, abbr in RECORD_PERM_KEYS.items() if sf.get(key)] |
| 2121 | record_permissions = [a for a in ('CE', 'CS') if a in record_permissions] |
| 2122 | |
| 2123 | default_perms = user_permissions + record_permissions |
| 2124 | if not default_perms: |
| 2125 | default_perms = ['RO'] |
| 2126 | |
| 2127 | users = [] |
| 2128 | user_parts = [] |
| 2129 | seen_emails = set() |
| 2130 | for u in sf.get('users') or []: |
| 2131 | email = _resolve_sf_member_email(params, u) |
| 2132 | account_uid = u.get('account_uid') or '' |
| 2133 | privs = [abbr for key_name, abbr in MEMBER_PERM_KEYS.items() if u.get(key_name)] |
| 2134 | privs = [a for a in ('MU', 'MR') if a in privs] or ['RO'] |
| 2135 | if not email: |
| 2136 | # Sync often has account_uid only until user_cache fills; still emit membership. |
| 2137 | if account_uid: |
| 2138 | entry = {'uid': account_uid, 'permissions': privs} |
| 2139 | users.append(entry) |
| 2140 | user_parts.append(f'[{account_uid}:{",".join(privs)}]') |
| 2141 | continue |
| 2142 | key = email.lower() |
| 2143 | if key in seen_emails: |
| 2144 | continue |
| 2145 | seen_emails.add(key) |
| 2146 | entry = {'email': email, 'permissions': privs} |
| 2147 | if include_uids and account_uid: |
| 2148 | entry['uid'] = account_uid |
| 2149 | users.append(entry) |
| 2150 | user_parts.append(f'[{email}:{",".join(privs)}]') |
| 2151 |