Skip to content

Commit

Permalink
Do not override the deafult manager
Browse files Browse the repository at this point in the history
* Introduce active manager for Topic and Product
  • Loading branch information
akatsoulas committed Jul 4, 2024
1 parent 92f669e commit 25b007a
Show file tree
Hide file tree
Showing 25 changed files with 113 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@
from django.conf import settings
from django.core.management.base import BaseCommand

from kitsune.dashboards.models import L10N_ALL_CODE, L10N_TOP20_CODE, L10N_TOP100_CODE, WikiMetric
from kitsune.dashboards.models import (
L10N_ALL_CODE,
L10N_TOP20_CODE,
L10N_TOP100_CODE,
WikiMetric,
)
from kitsune.dashboards.readouts import l10n_overview_rows
from kitsune.products.models import Product

Expand Down
1 change: 0 additions & 1 deletion kitsune/dashboards/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from django.core.cache import cache
from django.shortcuts import render
from google.auth.exceptions import GoogleAuthError

from OpenSSL.crypto import Error as OpenSSLError

from kitsune.announcements.forms import AnnouncementForm
Expand Down
2 changes: 1 addition & 1 deletion kitsune/landings/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def home(request):
request,
"landings/home.html",
{
"products": Product.objects.filter(visible=True),
"products": Product.active.filter(visible=True),
"featured": get_featured_articles(locale=request.LANGUAGE_CODE),
},
)
Expand Down
14 changes: 4 additions & 10 deletions kitsune/products/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@


class ArchivedFilter(admin.SimpleListFilter):
title = "Archived"
title = "Archived status"
parameter_name = "is_archived"

def lookups(
self, request: HttpRequest, model_admin: admin.ModelAdmin
) -> list[tuple[str, str]]:
return [("1", "Yes"), ("0", "No")]
return [("archived", "Yes"), ("not_archived", "No")]

def queryset(self, request: HttpRequest, queryset: QuerySet[Any]) -> QuerySet[Any]:
if self.value() == "1":
if self.value() == "archived":
return queryset.filter(is_archived=True)
if self.value() == "0":
if self.value() == "not_archived":
return queryset.filter(is_archived=False)
return queryset

Expand All @@ -32,9 +32,6 @@ class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
list_filter = (ArchivedFilter,)

def get_queryset(self, request: HttpRequest) -> QuerySet[Any]:
return Product.all_objects.all()


class TopicAdmin(admin.ModelAdmin):
def parent(obj):
Expand Down Expand Up @@ -69,9 +66,6 @@ def parent(obj):
readonly_fields = ("id",)
prepopulated_fields = {"slug": ("title",)}

def get_queryset(self, request: HttpRequest) -> QuerySet[Any]:
return Topic.all_objects.all()


class VersionAdmin(admin.ModelAdmin):
list_display = ("name", "product", "slug", "min_version", "max_version", "visible", "default")
Expand Down
19 changes: 11 additions & 8 deletions kitsune/products/api.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from django.conf import settings
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _lazy

from rest_framework import generics, serializers

from kitsune.products.models import Product, Topic, Platform
from kitsune.sumo.api_utils import LocaleNegotiationMixin, LocalizedCharField, ImageUrlField
from kitsune.products.models import Platform, Product, Topic
from kitsune.sumo.api_utils import (
ImageUrlField,
LocaleNegotiationMixin,
LocalizedCharField,
)
from kitsune.wiki.api import DocumentShortSerializer


Expand All @@ -23,7 +26,7 @@ class Meta:
class ProductList(generics.ListAPIView):
"""List all documents."""

queryset = Product.objects.all()
queryset = Product.active.all()
serializer_class = ProductSerializer


Expand All @@ -36,9 +39,9 @@ class Meta:


class TopicSerializer(serializers.ModelSerializer):
parent = serializers.SlugRelatedField(slug_field="slug", queryset=Topic.objects.all())
parent = serializers.SlugRelatedField(slug_field="slug", queryset=Topic.active.all())
path = serializers.ReadOnlyField()
product = serializers.SlugRelatedField(slug_field="slug", queryset=Product.objects.all())
product = serializers.SlugRelatedField(slug_field="slug", queryset=Product.active.all())
title = LocalizedCharField(l10n_context="DB: products.Topic.title")
subtopics = serializers.SerializerMethodField()
documents = serializers.SerializerMethodField()
Expand Down Expand Up @@ -70,7 +73,7 @@ def get_documents(self, obj):


class TopicDetail(LocaleNegotiationMixin, generics.RetrieveAPIView):
queryset = Topic.objects.all()
queryset = Topic.active.all()
serializer_class = TopicSerializer

def get_object(self):
Expand Down Expand Up @@ -108,7 +111,7 @@ def data(self):


class TopicList(LocaleNegotiationMixin, generics.ListAPIView):
queryset = Topic.objects.filter(parent=None)
queryset = Topic.active.filter(parent=None)
serializer_class = RootTopicSerializer

def get_queryset(self):
Expand Down
14 changes: 7 additions & 7 deletions kitsune/products/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ class Product(ModelBase):
# whether or not this product is archived
is_archived = models.BooleanField(default=False)

# Override default manager
objects = models.Manager()
active = ProductManager()

class Meta(object):
ordering = ["display_order"]

# Override default manager
objects = ProductManager()
all_objects = models.Manager()

def __str__(self):
return "%s" % self.title

Expand Down Expand Up @@ -125,8 +125,8 @@ class Meta(object):
unique_together = ("slug", "product")

# Override default manager
objects = NonArchivedManager()
all_objects = models.Manager()
objects = models.Manager()
active = NonArchivedManager()

def __str__(self):
return "[%s] %s" % (self.product.title, self.title)
Expand Down Expand Up @@ -206,7 +206,7 @@ class Meta(object):
def save(self, *args, **kwargs):
# Mark the old topics as archived
try:
old_topic = Topic.objects.get(slug=self.slug, product=self.topic.product)
old_topic = Topic.active.get(slug=self.slug, product=self.topic.product)
old_topic.is_archived = True
old_topic.save()
except Topic.DoesNotExist:
Expand Down
14 changes: 7 additions & 7 deletions kitsune/products/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
def product_list(request):
"""The product picker page."""
template = "products/products.html"
products = Product.objects.filter(visible=True)
products = Product.active.filter(visible=True)
return render(request, template, {"products": products})


Expand All @@ -43,7 +43,7 @@ def product_landing(request, slug):
if request.headers.get("x-requested-with") == "XMLHttpRequest":
# Return a list of topics/subtopics for the product
topic_list = list()
for t in Topic.objects.filter(product=product, visible=True):
for t in Topic.active.filter(product=product, visible=True):
topic_list.append({"id": t.id, "title": t.title})
return HttpResponse(json.dumps({"topics": topic_list}), content_type="application/json")

Expand All @@ -62,7 +62,7 @@ def product_landing(request, slug):
{
"product_key": _get_aaq_product_key(product.slug),
"product": product,
"products": Product.objects.filter(visible=True),
"products": Product.active.filter(visible=True),
"topics": topics_for(request.user, product=product, parent=None),
"search_params": {"product": slug},
"latest_version": latest_version,
Expand Down Expand Up @@ -121,14 +121,14 @@ def document_listing(request, topic_slug, product_slug=None, subtopic_slug=None)
}

if topic_navigation:
topics = Topic.objects.filter(**topic_kw)
topics = Topic.active.filter(**topic_kw)
topic_subquery = (
Topic.objects.filter(slug__in=NAVIGATION_TOPICS)
Topic.active.filter(slug__in=NAVIGATION_TOPICS)
.filter(slug=OuterRef("slug"))
.order_by("id")
.values("id")[:1]
)
topic_list = Topic.objects.filter(id__in=Subquery(topic_subquery))
topic_list = Topic.active.filter(id__in=Subquery(topic_subquery))
doc_kw["topics"] = topics
topic = topic_list.filter(slug=topic_slug).first()
else:
Expand Down Expand Up @@ -167,6 +167,6 @@ def document_listing(request, topic_slug, product_slug=None, subtopic_slug=None)
"search_params": {"product": product_slug},
"topic_navigation": topic_navigation,
"topic_list": topic_list,
"products": Product.objects.filter(visible=True, topics__in=topics),
"products": Product.active.filter(visible=True, topics__in=topics),
},
)
4 changes: 2 additions & 2 deletions kitsune/questions/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ class QuestionSerializer(serializers.ModelSerializer):
metadata = QuestionMetaDataSerializer(source="metadata_set", read_only=True, many=True)
num_votes = serializers.ReadOnlyField()
product = serializers.SlugRelatedField(
required=True, slug_field="slug", queryset=Product.objects.all()
required=True, slug_field="slug", queryset=Product.active.all()
)
tags = serializers.SerializerMethodField()
solution = serializers.PrimaryKeyRelatedField(read_only=True)
solved_by = serializers.SerializerMethodField()
taken_by = serializers.SerializerMethodField()
topic = TopicField(required=True, queryset=Topic.objects.all())
topic = TopicField(required=True, queryset=Topic.active.all())
updated = DateTimeUTCField(read_only=True)
updated_by = serializers.SerializerMethodField()

Expand Down
5 changes: 2 additions & 3 deletions kitsune/questions/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from django import forms
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _lazy
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _lazy

from kitsune.products.models import Topic
from kitsune.questions.events import QuestionReplyEvent
Expand All @@ -12,7 +12,6 @@
from kitsune.sumo.forms import KitsuneBaseForumForm
from kitsune.upload.models import ImageAttachment


# labels and help text
SITE_AFFECTED_LABEL = _lazy("URL of affected site")
CRASH_ID_LABEL = _lazy("Crash ID(s)")
Expand Down Expand Up @@ -239,7 +238,7 @@ def save(self, user, locale, product, product_config, *args, **kwargs):
if category_config:
t = category_config.get("topic")
if t:
self.instance.topic = Topic.objects.get(slug=t, product=product)
self.instance.topic = Topic.active.get(slug=t, product=product)

question = super(NewQuestionForm, self).save(*args, **kwargs)

Expand Down
22 changes: 11 additions & 11 deletions kitsune/questions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ def product_list(request):
return render(
request,
"questions/product_list.html",
{"products": Product.objects.with_question_forums(request)},
{"products": Product.active.with_question_forums(request)},
)


Expand Down Expand Up @@ -172,7 +172,7 @@ def question_list(request, product_slug=None, topic_slug=None):
return redirect(question_list, topic_slug=topic_history.topic.slug)
except TopicSlugHistory.DoesNotExist:
...
topics = Topic.objects.filter(visible=True, slug=topic_slug)
topics = Topic.active.filter(visible=True, slug=topic_slug)
topic_navigation = True
if not topics:
raise Http404()
Expand Down Expand Up @@ -307,19 +307,19 @@ def question_list(request, product_slug=None, topic_slug=None):
recent_answered_percent = 0

# List of products to fill the selector.
product_list = Product.objects.filter(visible=True)
product_list = Product.active.filter(visible=True)

# List of topics to fill the selector.
if products:
topic_list = Topic.objects.filter(visible=True, product=products[0])[:10]
topic_list = Topic.active.filter(visible=True, product=products[0])[:10]
else:
topic_subquery = (
Topic.objects.filter(slug__in=NAVIGATION_TOPICS)
Topic.active.filter(slug__in=NAVIGATION_TOPICS)
.filter(slug=OuterRef("slug"))
.order_by("id")
.values("id")[:1]
)
topic_list = Topic.objects.filter(id__in=Subquery(topic_subquery))
topic_list = Topic.active.filter(id__in=Subquery(topic_subquery))

# Store current filters in the session
if request.user.is_authenticated:
Expand Down Expand Up @@ -448,7 +448,7 @@ def question_details(

extra_kwargs.update(ans_)

products = Product.objects.with_question_forums(request)
products = Product.active.with_question_forums(request)
topics = topics_for(request.user, product=question.product)

related_documents = question.related_documents
Expand Down Expand Up @@ -479,8 +479,8 @@ def question_details(
@permission_required("questions.change_question")
def edit_details(request, question_id):
try:
product = Product.objects.get(id=request.POST.get("product"))
topic = Topic.objects.get(id=request.POST.get("topic"), product=product)
product = Product.active.get(id=request.POST.get("product"))
topic = Topic.active.get(id=request.POST.get("topic"), product=product)
locale = request.POST.get("locale")

# If locale is not in AAQ_LANGUAGES throws a ValueError
Expand Down Expand Up @@ -534,7 +534,7 @@ def aaq(request, product_key=None, category_key=None, step=1, is_loginless=False
# If the selected product doesn't exist in DB, render a 404
if step > 1:
try:
product = Product.objects.get(slug=product_config["product"])
product = Product.active.get(slug=product_config["product"])
except Product.DoesNotExist:
raise Http404
has_public_forum = product.questions_enabled(locale=request.LANGUAGE_CODE)
Expand Down Expand Up @@ -1364,7 +1364,7 @@ def metrics(request, locale_code=None):
data = {
"current_locale": locale_code,
"product": product,
"products": Product.objects.filter(visible=True),
"products": Product.active.filter(visible=True),
}

return render(request, template, data)
Expand Down
2 changes: 1 addition & 1 deletion kitsune/search/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def __init__(self, *args, **kwargs):
super(SimpleSearchForm, self).__init__(*args, **kwargs)

product_field = self.fields["product"]
product_field.choices = Product.objects.values_list("slug", "title")
product_field.choices = Product.active.values_list("slug", "title")

def clean_products(self):
products = self.cleaned_data["products"]
Expand Down
8 changes: 4 additions & 4 deletions kitsune/search/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from django.conf import settings
from django.http import HttpResponse
from django.shortcuts import render
from django.utils.translation import pgettext
from django.utils.translation import gettext as _
from django.utils.translation import pgettext
from django.views.decorators.cache import cache_page

from kitsune import search as constants
Expand Down Expand Up @@ -52,7 +52,7 @@ def _fallback_results(user, locale, product_slugs):
products = []
for slug in product_slugs:
try:
p = Product.objects.get(slug=slug)
p = Product.active.get(slug=slug)
products.append(p)
except Product.DoesNotExist:
pass
Expand All @@ -64,7 +64,7 @@ def _fallback_results(user, locale, product_slugs):


def _get_product_title(product_title):
product = Product.objects.filter(slug__in=product_title).first()
product = Product.active.filter(slug__in=product_title).first()
if product:
product_titles = [pgettext("DB: products.Product.title", product.title)]
else:
Expand Down Expand Up @@ -127,7 +127,7 @@ def simple_search(request):
"q": cleaned["q"],
"w": cleaned["w"],
"lang_name": lang_name,
"products": Product.objects.filter(visible=True),
"products": Product.active.filter(visible=True),
}

if not is_json:
Expand Down
Loading

0 comments on commit 25b007a

Please sign in to comment.