Browse Source

Remove handling of None in some query methods

The previous setup was a bit unusual and confusing - various functions
that restricted the query somehow were accepting None as an argument and
simply doing nothing if it was passed. This made calling them a little
simpler, but overall didn't make a lot of sense - if you don't want to
apply the restriction, you shouldn't call the function in the first
place.
merge-requests/19/head
Deimos 6 years ago
parent
commit
52db30cdad
  1. 10
      tildes/tildes/models/pagination.py
  2. 13
      tildes/tildes/models/topic/topic_query.py
  3. 20
      tildes/tildes/views/topic.py

10
tildes/tildes/models/pagination.py

@ -74,11 +74,8 @@ class PaginatedQuery(ModelQuery):
""" """
return bool(self.before_id) return bool(self.before_id)
def after_id36(self, id36: Optional[str]) -> 'PaginatedQuery':
def after_id36(self, id36: str) -> 'PaginatedQuery':
"""Restrict the query to results after an id36 (generative).""" """Restrict the query to results after an id36 (generative)."""
if not id36:
return self
if self.before_id: if self.before_id:
raise ValueError("Can't set both before and after restrictions") raise ValueError("Can't set both before and after restrictions")
@ -86,11 +83,8 @@ class PaginatedQuery(ModelQuery):
return self return self
def before_id36(self, id36: Optional[str]) -> 'PaginatedQuery':
def before_id36(self, id36: str) -> 'PaginatedQuery':
"""Restrict the query to results before an id36 (generative).""" """Restrict the query to results before an id36 (generative)."""
if not id36:
return self
if self.after_id: if self.after_id:
raise ValueError("Can't set both before and after restrictions") raise ValueError("Can't set both before and after restrictions")

13
tildes/tildes/models/topic/topic_query.py

@ -1,6 +1,6 @@
"""Contains the TopicQuery class.""" """Contains the TopicQuery class."""
from typing import Any, Optional, Sequence
from typing import Any, Sequence
from pyramid.request import Request from pyramid.request import Request
from sqlalchemy.sql.expression import and_, null from sqlalchemy.sql.expression import and_, null
@ -119,21 +119,12 @@ class TopicQuery(PaginatedQuery):
return self.filter( return self.filter(
Topic.group_id.in_(subgroup_subquery)) # type: ignore Topic.group_id.in_(subgroup_subquery)) # type: ignore
def inside_time_period(
self,
period: Optional[SimpleHoursPeriod],
) -> 'TopicQuery':
def inside_time_period(self, period: SimpleHoursPeriod) -> 'TopicQuery':
"""Restrict the topics to inside a time period (generative).""" """Restrict the topics to inside a time period (generative)."""
if not period:
return self
return self.filter(Topic.created_time > utc_now() - period.timedelta) return self.filter(Topic.created_time > utc_now() - period.timedelta)
def has_tag(self, tag: Ltree) -> 'TopicQuery': def has_tag(self, tag: Ltree) -> 'TopicQuery':
"""Restrict the topics to ones with a specific tag (generative).""" """Restrict the topics to ones with a specific tag (generative)."""
if not tag:
return self
# casting tag to string really shouldn't be necessary, but some kind of # casting tag to string really shouldn't be necessary, but some kind of
# strange interaction seems to be happening with the ArrayOfLtree # strange interaction seems to be happening with the ArrayOfLtree
# class, this will need some investigation # class, this will need some investigation

20
tildes/tildes/views/topic.py

@ -122,17 +122,29 @@ def get_group_topics(
if period is missing: if period is missing:
period = default_settings.period period = default_settings.period
# set up the basic query for topics
query = ( query = (
request.query(Topic) request.query(Topic)
.join_all_relationships() .join_all_relationships()
.inside_groups(groups) .inside_groups(groups)
.inside_time_period(period)
.has_tag(tag)
.apply_sort_option(order) .apply_sort_option(order)
.after_id36(after)
.before_id36(before)
) )
# restrict the time period, if not set to "all time"
if period:
query = query.inside_time_period(period)
# restrict to a specific tag, if we're viewing a single one
if tag:
query = query.has_tag(tag)
# apply before/after pagination restrictions if relevant
if before:
query = query.before_id36(before)
if after:
query = query.after_id36(after)
# apply topic tag filters unless they're disabled or viewing a single tag # apply topic tag filters unless they're disabled or viewing a single tag
if not (tag or unfiltered): if not (tag or unfiltered):
# pylint: disable=protected-access # pylint: disable=protected-access

Loading…
Cancel
Save