def invite_web_user_form(self): role_choices = _get_editable_role_choices(self.domain, self.request.couch_user, allow_admin_role=True) loc = None domain_request = DomainRequest.objects.get( id=self.request_id) if self.request_id else None initial = { 'email': domain_request.email if domain_request else None, } if 'location_id' in self.request.GET: from corehq.apps.locations.models import SQLLocation loc = SQLLocation.objects.get( location_id=self.request.GET.get('location_id')) if self.request.method == 'POST': current_users = [ user.username for user in WebUser.by_domain(self.domain) ] pending_invites = [ di.email for di in Invitation.by_domain(self.domain) ] return AdminInvitesUserForm(self.request.POST, excluded_emails=current_users + pending_invites, role_choices=role_choices, domain=self.domain) return AdminInvitesUserForm(initial=initial, role_choices=role_choices, domain=self.domain, location=loc)
def parse_web_users(domain, task=None, total_count=None): user_dicts = [] max_location_length = 0 location_cache = LocationIdToSiteCodeCache(domain) for n, user in enumerate(get_all_user_rows(domain, include_web_users=True, include_mobile_users=False, include_inactive=False, include_docs=True)): user_dict = make_web_user_dict(user, location_cache, domain) user_dicts.append(user_dict) max_location_length = max(max_location_length, len(user_dict["location_code"])) if task: DownloadBase.set_progress(task, n, total_count) for m, invite in enumerate(Invitation.by_domain(domain)): user_dict = make_invited_web_user_dict(invite, location_cache) user_dicts.append(user_dict) if task: DownloadBase.set_progress(task, n + m, total_count) user_headers = [ 'username', 'first_name', 'last_name', 'email', 'role', 'last_access_date (read only)', 'last_login (read only)', 'status', 'remove' ] if domain_has_privilege(domain, privileges.LOCATIONS): user_headers.extend(json_to_headers( {'location_code': list(range(1, max_location_length + 1))} )) return user_headers, get_user_rows(user_dicts, user_headers)
def rows_for_domain(self, domain_obj): rows = [] for user in get_all_user_rows(domain_obj.name, include_web_users=True, include_mobile_users=False, include_inactive=False, include_docs=True): user = CouchUser.wrap_correctly(user['doc']) domain_membership = user.get_domain_membership(domain_obj.name) last_accessed_domain = None if domain_membership: last_accessed_domain = domain_membership.last_accessed rows.append([ user.username, user.full_name, user.role_label(domain_obj.name), self.format_date(user.last_login), last_accessed_domain, _('Active User') ] + self.domain_properties(domain_obj)) for invite in Invitation.by_domain(domain_obj.name): rows.append([ invite.email, 'N/A', invite.get_role_name(), 'N/A', 'N/A', _('Invited') ] + self.domain_properties(domain_obj)) return rows
def resend_pending_invitations(): from corehq.apps.users.models import Invitation days_to_resend = (15, 29) days_to_expire = 30 domains = Domain.get_all() for domain in domains: invitations = Invitation.by_domain(domain.name) for invitation in invitations: days = (datetime.utcnow() - invitation.invited_on).days if days in days_to_resend: invitation.send_activation_email(days_to_expire - days)
def invitations(self): return [ { "uuid": str(invitation.uuid), "email": invitation.email, "email_marked_as_bounced": bool(invitation.email_marked_as_bounced), "invited_on": invitation.invited_on, "role_label": self.role_labels.get(invitation.role, ""), } for invitation in Invitation.by_domain(self.domain) ]
def parse_web_users(domain, task=None, total_count=None): user_dicts = [] for n, user in enumerate(get_all_user_rows(domain, include_web_users=True, include_mobile_users=False, include_inactive=False, include_docs=True)): user_dict = make_web_user_dict(user, domain) user_dicts.append(user_dict) if task: DownloadBase.set_progress(task, n, total_count) for m, invite in enumerate(Invitation.by_domain(domain)): user_dict = make_invited_web_user_dict(invite) user_dicts.append(user_dict) if task: DownloadBase.set_progress(task, n + m, total_count) user_headers = [ 'username', 'first_name', 'last_name', 'email', 'role', 'last_access_date (read only)', 'last_login (read only)', 'status', 'remove' ] return user_headers, get_user_rows(user_dicts, user_headers)
def invite_web_user_form(self): role_choices = UserRole.role_choices(self.domain) loc = None domain_request = DomainRequest.objects.get(id=self.request_id) if self.request_id else None initial = {"email": domain_request.email if domain_request else None} if "location_id" in self.request.GET: from corehq.apps.locations.models import SQLLocation loc = SQLLocation.objects.get(location_id=self.request.GET.get("location_id")) if self.request.method == "POST": current_users = [user.username for user in WebUser.by_domain(self.domain)] pending_invites = [di.email for di in Invitation.by_domain(self.domain)] return AdminInvitesUserForm( self.request.POST, excluded_emails=current_users + pending_invites, role_choices=role_choices, domain=self.domain, ) return AdminInvitesUserForm(initial=initial, role_choices=role_choices, domain=self.domain, location=loc)
def invite_web_user_form(self): role_choices = _get_editable_role_choices(self.domain, self.request.couch_user, allow_admin_role=True) loc = None domain_request = DomainRequest.objects.get(id=self.request_id) if self.request_id else None initial = { 'email': domain_request.email if domain_request else None, } if 'location_id' in self.request.GET: from corehq.apps.locations.models import SQLLocation loc = SQLLocation.objects.get(location_id=self.request.GET.get('location_id')) if self.request.method == 'POST': current_users = [user.username for user in WebUser.by_domain(self.domain)] pending_invites = [di.email for di in Invitation.by_domain(self.domain)] return AdminInvitesUserForm( self.request.POST, excluded_emails=current_users + pending_invites, role_choices=role_choices, domain=self.domain ) return AdminInvitesUserForm(initial=initial, role_choices=role_choices, domain=self.domain, location=loc)
def _get_invitations_by_filters(domain, user_filters, count_only=False): """ Similar to _get_users_by_filters, but applites to invitations. Applies "search_string" filter to the invitations' emails. This does not support ES search syntax, it's just a case-insensitive substring search. Ignores any other filters. """ filters = {} search_string = user_filters.get("search_string", None) if search_string: filters["email__icontains"] = search_string role_id = user_filters.get("role_id", None) if role_id: role = UserRole.objects.by_couch_id(role_id) filters["role"] = role.get_qualified_id() invitations = Invitation.by_domain(domain, **filters) if count_only: return invitations.count() return invitations
def rows_for_domain(self, domain_obj): def _get_role_name(role): if role: if role == 'admin': return role else: role_id = role[len('user-role:'):] try: return UserRole.get(role_id).name except ResourceNotFound: return _('Unknown Role') else: return 'N/A' rows = [] for user in get_all_user_rows(domain_obj.name, include_web_users=True, include_mobile_users=False, include_inactive=False, include_docs=True): user = CouchUser.wrap_correctly(user['doc']) domain_membership = user.get_domain_membership(domain_obj.name) last_accessed_domain = None if domain_membership: last_accessed_domain = domain_membership.last_accessed rows.append([ user.username, user.full_name, user.role_label(domain_obj.name), self.format_date(user.last_login), last_accessed_domain, _('Active User') ] + self.domain_properties(domain_obj)) for invite in Invitation.by_domain(domain_obj.name): rows.append([ invite.email, 'N/A', _get_role_name(invite.role), 'N/A', 'N/A', _('Invited') ] + self.domain_properties(domain_obj)) return rows
def invitations(self): invitations = Invitation.by_domain(self.domain) for invitation in invitations: invitation.role_label = self.role_labels.get(invitation.role, "") return invitations
def test_by_domain(self): self.assertEqual(len(Invitation.by_domain('domain_1')), 1) self.assertEqual(len(Invitation.by_domain('domain_2')), 1) self.assertEqual(len(Invitation.by_domain('domain_3')), 0)
def test_by_domain(self): self.assertEqual(len(Invitation.by_domain('domain_1')), 1) self.assertEqual( len(Invitation.by_domain('domain_1', is_accepted=True)), 2) self.assertEqual(len(Invitation.by_domain('domain_2')), 1) self.assertEqual(len(Invitation.by_domain('domain_3')), 0)