mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	models: Tighten function signatures with generic QuerySet.
TODO: For now, we import `_QuerySet` as `ValuesQuerySet`. But there is a convenient reexport of `ValuesQuerySet` in `django_stubs_ext` that does the same thing. Once we get django-stubs integrated, we should import `ValuesQuerySet` from `django_stubs_ext` instead. Signed-off-by: Zixuan James Li <p359101898@gmail.com>
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							81ab0b3615
						
					
				
				
					commit
					9d18845be5
				
			@@ -118,6 +118,7 @@ STREAM_NAMES = TypeVar("STREAM_NAMES", Sequence[str], AbstractSet[str])
 | 
			
		||||
if TYPE_CHECKING:
 | 
			
		||||
    # We use ModelBackend only for typing. Importing it otherwise causes circular dependency.
 | 
			
		||||
    from django.contrib.auth.backends import ModelBackend
 | 
			
		||||
    from django.db.models.query import _QuerySet as ValuesQuerySet
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class EmojiInfo(TypedDict):
 | 
			
		||||
@@ -799,7 +800,7 @@ class Realm(models.Model):
 | 
			
		||||
 | 
			
		||||
    def get_admin_users_and_bots(
 | 
			
		||||
        self, include_realm_owners: bool = True
 | 
			
		||||
    ) -> Sequence["UserProfile"]:
 | 
			
		||||
    ) -> QuerySet["UserProfile"]:
 | 
			
		||||
        """Use this in contexts where we want administrative users as well as
 | 
			
		||||
        bots with administrator privileges, like send_event calls for
 | 
			
		||||
        notifications to all administrator users.
 | 
			
		||||
@@ -809,14 +810,13 @@ class Realm(models.Model):
 | 
			
		||||
        else:
 | 
			
		||||
            roles = [UserProfile.ROLE_REALM_ADMINISTRATOR]
 | 
			
		||||
 | 
			
		||||
        # TODO: Change return type to QuerySet[UserProfile]
 | 
			
		||||
        return UserProfile.objects.filter(
 | 
			
		||||
            realm=self,
 | 
			
		||||
            is_active=True,
 | 
			
		||||
            role__in=roles,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def get_human_admin_users(self, include_realm_owners: bool = True) -> QuerySet:
 | 
			
		||||
    def get_human_admin_users(self, include_realm_owners: bool = True) -> QuerySet["UserProfile"]:
 | 
			
		||||
        """Use this in contexts where we want only human users with
 | 
			
		||||
        administrative privileges, like sending an email to all of a
 | 
			
		||||
        realm's administrators (bots don't have real email addresses).
 | 
			
		||||
@@ -826,7 +826,6 @@ class Realm(models.Model):
 | 
			
		||||
        else:
 | 
			
		||||
            roles = [UserProfile.ROLE_REALM_ADMINISTRATOR]
 | 
			
		||||
 | 
			
		||||
        # TODO: Change return type to QuerySet[UserProfile]
 | 
			
		||||
        return UserProfile.objects.filter(
 | 
			
		||||
            realm=self,
 | 
			
		||||
            is_bot=False,
 | 
			
		||||
@@ -834,7 +833,7 @@ class Realm(models.Model):
 | 
			
		||||
            role__in=roles,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def get_human_billing_admin_and_realm_owner_users(self) -> QuerySet:
 | 
			
		||||
    def get_human_billing_admin_and_realm_owner_users(self) -> QuerySet["UserProfile"]:
 | 
			
		||||
        return UserProfile.objects.filter(
 | 
			
		||||
            Q(role=UserProfile.ROLE_REALM_OWNER) | Q(is_billing_admin=True),
 | 
			
		||||
            realm=self,
 | 
			
		||||
@@ -842,8 +841,7 @@ class Realm(models.Model):
 | 
			
		||||
            is_active=True,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def get_active_users(self) -> Sequence["UserProfile"]:
 | 
			
		||||
        # TODO: Change return type to QuerySet[UserProfile]
 | 
			
		||||
    def get_active_users(self) -> QuerySet["UserProfile"]:
 | 
			
		||||
        return UserProfile.objects.filter(realm=self, is_active=True).select_related()
 | 
			
		||||
 | 
			
		||||
    def get_first_human_user(self) -> Optional["UserProfile"]:
 | 
			
		||||
@@ -857,7 +855,7 @@ class Realm(models.Model):
 | 
			
		||||
        """
 | 
			
		||||
        return UserProfile.objects.filter(realm=self, is_bot=False).order_by("id").first()
 | 
			
		||||
 | 
			
		||||
    def get_human_owner_users(self) -> QuerySet:
 | 
			
		||||
    def get_human_owner_users(self) -> QuerySet["UserProfile"]:
 | 
			
		||||
        return UserProfile.objects.filter(
 | 
			
		||||
            realm=self, is_bot=False, role=UserProfile.ROLE_REALM_OWNER, is_active=True
 | 
			
		||||
        )
 | 
			
		||||
@@ -2254,9 +2252,9 @@ class PreregistrationUser(models.Model):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def filter_to_valid_prereg_users(
 | 
			
		||||
    query: QuerySet,
 | 
			
		||||
    query: QuerySet[PreregistrationUser],
 | 
			
		||||
    invite_expires_in_minutes: Union[Optional[int], UnspecifiedValue] = UnspecifiedValue(),
 | 
			
		||||
) -> QuerySet:
 | 
			
		||||
) -> QuerySet[PreregistrationUser]:
 | 
			
		||||
    """
 | 
			
		||||
    If invite_expires_in_days is specified, we return only those PreregistrationUser
 | 
			
		||||
    objects that were created at most that many days in the past.
 | 
			
		||||
@@ -2494,7 +2492,7 @@ class Stream(models.Model):
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    def get_client_data(query: QuerySet) -> List[APIStreamDict]:
 | 
			
		||||
    def get_client_data(query: QuerySet["Stream"]) -> List[APIStreamDict]:
 | 
			
		||||
        query = query.only(*Stream.API_FIELDS)
 | 
			
		||||
        return [row.to_dict() for row in query]
 | 
			
		||||
 | 
			
		||||
@@ -2641,16 +2639,14 @@ def get_realm_stream(stream_name: str, realm_id: int) -> Stream:
 | 
			
		||||
    return Stream.objects.select_related().get(name__iexact=stream_name.strip(), realm_id=realm_id)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_active_streams(realm: Realm) -> QuerySet:
 | 
			
		||||
    # TODO: Change return type to QuerySet[Stream]
 | 
			
		||||
    # NOTE: Return value is used as a QuerySet, so cannot currently be Sequence[QuerySet]
 | 
			
		||||
def get_active_streams(realm: Realm) -> QuerySet[Stream]:
 | 
			
		||||
    """
 | 
			
		||||
    Return all streams (including invite-only streams) that have not been deactivated.
 | 
			
		||||
    """
 | 
			
		||||
    return Stream.objects.filter(realm=realm, deactivated=False)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_linkable_streams(realm_id: int) -> QuerySet:
 | 
			
		||||
def get_linkable_streams(realm_id: int) -> QuerySet[Stream]:
 | 
			
		||||
    """
 | 
			
		||||
    This returns the streams that we are allowed to linkify using
 | 
			
		||||
    something like "#frontend" in our markup. For now the business
 | 
			
		||||
@@ -2674,7 +2670,7 @@ def get_stream_by_id_in_realm(stream_id: int, realm: Realm) -> Stream:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def bulk_get_streams(realm: Realm, stream_names: STREAM_NAMES) -> Dict[str, Any]:
 | 
			
		||||
    def fetch_streams_by_name(stream_names: List[str]) -> Sequence[Stream]:
 | 
			
		||||
    def fetch_streams_by_name(stream_names: List[str]) -> QuerySet[Stream]:
 | 
			
		||||
        #
 | 
			
		||||
        # This should be just
 | 
			
		||||
        #
 | 
			
		||||
@@ -2717,7 +2713,7 @@ def get_huddle_recipient(user_profile_ids: Set[int]) -> Recipient:
 | 
			
		||||
    return huddle.recipient
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_huddle_user_ids(recipient: Recipient) -> List[int]:
 | 
			
		||||
def get_huddle_user_ids(recipient: Recipient) -> "ValuesQuerySet[Subscription, int]":
 | 
			
		||||
    assert recipient.type == Recipient.HUDDLE
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
@@ -2926,8 +2922,7 @@ class Message(AbstractMessage):
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_context_for_message(message: Message) -> Sequence[Message]:
 | 
			
		||||
    # TODO: Change return type to QuerySet[Message]
 | 
			
		||||
def get_context_for_message(message: Message) -> QuerySet[Message]:
 | 
			
		||||
    return Message.objects.filter(
 | 
			
		||||
        recipient_id=message.recipient_id,
 | 
			
		||||
        subject=message.subject,
 | 
			
		||||
@@ -3675,7 +3670,7 @@ def get_user_by_delivery_email(email: str, realm: Realm) -> UserProfile:
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_users_by_delivery_email(emails: Set[str], realm: Realm) -> QuerySet:
 | 
			
		||||
def get_users_by_delivery_email(emails: Set[str], realm: Realm) -> QuerySet[UserProfile]:
 | 
			
		||||
    """This is similar to get_user_by_delivery_email, and
 | 
			
		||||
    it has the same security caveats.  It gets multiple
 | 
			
		||||
    users and returns a QuerySet, since most callers
 | 
			
		||||
@@ -4059,7 +4054,7 @@ class DefaultStreamGroup(models.Model):
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_default_stream_groups(realm: Realm) -> List[DefaultStreamGroup]:
 | 
			
		||||
def get_default_stream_groups(realm: Realm) -> QuerySet[DefaultStreamGroup]:
 | 
			
		||||
    return DefaultStreamGroup.objects.filter(realm=realm)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -4504,7 +4499,7 @@ class CustomProfileField(models.Model):
 | 
			
		||||
        return f"<CustomProfileField: {self.realm} {self.name} {self.field_type} {self.order}>"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def custom_profile_fields_for_realm(realm_id: int) -> List[CustomProfileField]:
 | 
			
		||||
def custom_profile_fields_for_realm(realm_id: int) -> QuerySet[CustomProfileField]:
 | 
			
		||||
    return CustomProfileField.objects.filter(realm=realm_id).order_by("order")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user