Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions .github/workflows/pythonpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,10 @@ jobs:
run: |
python -m pip install --upgrade pip
pip install -r requirements/production.txt
- name: Lint with flake8
- name: Install Linter
run: |
pip install flake8
flake8 .
- name: iSort
run: |
pip install isort
isort --check-only --diff cab comments_spamfighter djangosnippets ratings
pip install ruff
ruff check .
- name: Run migrations
run: python manage.py migrate
- name: Collect static files
Expand Down
20 changes: 6 additions & 14 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v3.2.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files

- repo: https://github.com/pycqa/isort
rev: 5.13.2
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.14.3
hooks:
- id: isort

- repo: https://github.com/psf/black
rev: 25.1.0
hooks:
- id: black

- repo: https://github.com/pycqa/flake8
rev: '7.2.0' # pick a git hash / tag to point to
hooks:
- id: flake8
- id: ruff-check
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
Empty file added base/components/__init__.py
Empty file.
39 changes: 21 additions & 18 deletions base/components/components.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Literal, Optional
from typing import Literal

from django_components import Component, register
from pydantic import BaseModel
Expand All @@ -10,7 +10,6 @@

@register("icon")
class Icon(Component):

class Kwargs(BaseModel):
kind: Literal["heart", "bookmark"]
color: str
Expand All @@ -29,8 +28,8 @@ def get_template_data(self, args, kwargs, slots, context):

class PaginationItem(BaseModel):
kind: Literal["current", "ellipsis", "number"]
text: Optional[str | int] = None
attrs: Optional[dict] = None
text: str | int | None = None
attrs: dict | None = None


@register("pagination")
Expand All @@ -48,21 +47,26 @@ def pagination_number(self, pagination: Pagination, num: int) -> PaginationItem:
"""
if num == pagination.paginator.ELLIPSIS:
return PaginationItem(kind="ellipsis", text=str(pagination.paginator.ELLIPSIS))
elif num == pagination.page_num:
if num == pagination.page_num:
return PaginationItem(kind="current", text=num)
else:
link = querystring(None, {**pagination.params, PAGE_VAR: num})
return PaginationItem(
kind="number",
text=num,
attrs={"href": link},
)
link = querystring(None, {**pagination.params, PAGE_VAR: num})
return PaginationItem(
kind="number",
text=num,
attrs={"href": link},
)

def get_template_data(self, args, kwargs, slots, context):
pagination = kwargs.pagination_obj
page_elements = [self.pagination_number(pagination, page_num) for page_num in pagination.page_range]
previous_page_link = f"?{PAGE_VAR}={pagination.page_num - 1}" if pagination.page.has_previous() else ""
next_page_link = f"?{PAGE_VAR}={pagination.page_num + 1}" if pagination.page.has_next() else ""
page_elements = [
self.pagination_number(pagination, page_num) for page_num in pagination.page_range
]
previous_page_link = (
f"?{PAGE_VAR}={pagination.page_num - 1}" if pagination.page.has_previous() else ""
)
next_page_link = (
f"?{PAGE_VAR}={pagination.page_num + 1}" if pagination.page.has_next() else ""
)
return {
"pagination": pagination,
"previous_page_link": previous_page_link,
Expand All @@ -74,7 +78,7 @@ def get_template_data(self, args, kwargs, slots, context):
class TabItem(BaseModel):
text: str
is_current: bool
attrs: Optional[dict]
attrs: dict | None


@register("sorting_tabs")
Expand All @@ -95,8 +99,7 @@ def create_tab(self, object_list: ObjectList, tab: str) -> TabItem:
return TabItem(text=verbose_text, is_current=is_current, attrs=attrs)

def create_all_tabs(self, object_list: ObjectList):
tabs = [self.create_tab(object_list, tab) for tab in object_list.sorting_tabs]
return tabs
return [self.create_tab(object_list, tab) for tab in object_list.sorting_tabs]

def get_template_data(self, args, kwargs, slots, context):
object_list = kwargs.object_list
Expand Down
4 changes: 1 addition & 3 deletions base/exceptions.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
class IncorectLookupParameter(Exception):
class IncorrectLookupParameterError(Exception):
"""
Raised when a query parameter contains an incorrect value.
"""

pass
3 changes: 1 addition & 2 deletions base/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,4 @@ def paginate(self, request, queryset):

def get_objects(self, request, queryset):
tab_result = self.tab_sort(queryset)
paginate_result = self.paginate(request, tab_result)
return paginate_result
return self.paginate(request, tab_result)
6 changes: 3 additions & 3 deletions base/pagination.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.core.paginator import InvalidPage, Paginator

from .exceptions import IncorectLookupParameter
from .exceptions import IncorrectLookupParameterError

PAGE_VAR = "page"

Expand Down Expand Up @@ -49,6 +49,6 @@ def get_objects(self):
else:
try:
result_list = self.paginator.page(self.page_num).object_list
except InvalidPage:
raise IncorectLookupParameter
except InvalidPage as err:
raise IncorrectLookupParameterError from err
return result_list
8 changes: 6 additions & 2 deletions base/templatetags/base_templatetags.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,16 @@ def querystring(context, *args, **kwargs):
params = QueryDict(mutable=True)
for d in [*args, kwargs]:
if not isinstance(d, Mapping):
msg = f"querystring requires mappings for positional arguments (got {d!r} instead)."
raise TemplateSyntaxError(
"querystring requires mappings for positional arguments (got " "%r instead)." % d
msg,
)
for key, value in d.items():
if not isinstance(key, str):
raise TemplateSyntaxError("querystring requires strings for mapping keys (got %r " "instead)." % key)
msg = f"querystring requires strings for mapping keys (got {key!r} instead)."
raise TemplateSyntaxError(
msg,
)
if value is None:
params.pop(key, None)
elif isinstance(value, Iterable) and not isinstance(value, str):
Expand Down
41 changes: 35 additions & 6 deletions base/tests/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@


class Migration(migrations.Migration):

initial = True

dependencies = [
Expand All @@ -17,26 +16,56 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name="Beverage",
fields=[
("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="Food",
fields=[
("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=50)),
],
),
migrations.CreateModel(
name="BeverageRating",
fields=[
("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("score", models.FloatField(db_index=True, default=0)),
("hashed", models.CharField(db_index=True, editable=False, max_length=40)),
(
"hashed",
models.CharField(db_index=True, editable=False, max_length=40),
),
(
"content_object",
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="tests.Beverage"),
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="tests.Beverage",
),
),
(
"user",
Expand Down
11 changes: 9 additions & 2 deletions base/tests/migrations/0002_fish.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@


class Migration(migrations.Migration):

dependencies = [
("tests", "0001_initial"),
]
Expand All @@ -13,7 +12,15 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name="Fish",
fields=[
("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("price", models.IntegerField()),
],
Expand Down
1 change: 0 additions & 1 deletion base/tests/test_components.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class FishList(ObjectList):


class SortingTabsComponentTests(TestCase):

@classmethod
def setUpTestData(cls):
fish_data = [Fish(name=f"fish-{i}", price=i * 100) for i in range(1, 21)]
Expand Down
11 changes: 5 additions & 6 deletions base/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ class FishList(ObjectList):


class ObjectListTests(TestCase):

@classmethod
def setUpTestData(cls):
fishs = [
Expand Down Expand Up @@ -91,12 +90,12 @@ def test_pagination_attributes(self):

def test_pagination_page_range(self):
request = self.factory.get("/fake-url/")
ELLIPSIS = "…"
ellipsis = "…"
case = [
(2, 6, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS, 49, 50]),
(3, 10, [1, 2, ELLIPSIS, 7, 8, 9, 10, 11, 12, 13, ELLIPSIS, 33, 34]),
(4, 23, [1, 2, ELLIPSIS, 20, 21, 22, 23, 24, 25]),
(5, 20, [1, 2, ELLIPSIS, 17, 18, 19, 20]),
(2, 6, [1, 2, 3, 4, 5, 6, 7, 8, 9, ellipsis, 49, 50]),
(3, 10, [1, 2, ellipsis, 7, 8, 9, 10, 11, 12, 13, ellipsis, 33, 34]),
(4, 23, [1, 2, ellipsis, 20, 21, 22, 23, 24, 25]),
(5, 20, [1, 2, ellipsis, 17, 18, 19, 20]),
(10, 8, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]),
(20, 1, [1, 2, 3, 4, 5]),
]
Expand Down
2 changes: 1 addition & 1 deletion cab/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from rest_framework import serializers

from ..models import Snippet
from cab.models import Snippet


class SnippetSerializer(serializers.ModelSerializer):
Expand Down
3 changes: 2 additions & 1 deletion cab/api/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from rest_framework import generics

from ..models import Snippet
from cab.models import Snippet

from .serializers import SnippetSerializer


Expand Down
Empty file added cab/components/__init__.py
Empty file.
1 change: 0 additions & 1 deletion cab/components/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

@register("snippet_list")
class SnippetListComponent(Component):

template_file = "snippet_list.html"

class Kwargs(BaseModel):
Expand Down
22 changes: 9 additions & 13 deletions cab/feeds.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,8 @@ class LatestSnippetsFeed(Feed):

def title(self):
if SITE_NAME:
return "%s: Latest snippets" % SITE_NAME
else:
return "Latest snippets"
return f"{SITE_NAME}: Latest snippets"
return "Latest snippets"

def item_author_name(self, item):
return item.author.username
Expand Down Expand Up @@ -63,13 +62,12 @@ def items(self, obj):
return Snippet.objects.filter(author=obj)[:15]

def link(self, obj):
return "/users/%s/" % obj.username
return f"/users/{obj.username}/"

def title(self, obj):
if SITE_NAME:
return "%s: Latest snippets posted by %s" % (SITE_NAME, obj.username)
else:
return "Latest snippets posted by %s" % obj.username
return f"{SITE_NAME}: Latest snippets posted by {obj.username}"
return f"Latest snippets posted by {obj.username}"

def item_author_name(self, item):
return item.author.username
Expand Down Expand Up @@ -102,9 +100,8 @@ def link(self, obj):

def title(self, obj):
if SITE_NAME:
return "%s: Latest snippets written in %s" % (SITE_NAME, obj.name)
else:
return "Latest snippets written in %s" % obj.name
return f"{SITE_NAME}: Latest snippets written in {obj.name}"
return f"Latest snippets written in {obj.name}"

def item_author_name(self, item):
return item.author.username
Expand Down Expand Up @@ -138,9 +135,8 @@ def link(self, obj):

def title(self, obj):
if SITE_NAME:
return "%s: Latest snippets tagged with '%s'" % (SITE_NAME, obj.name)
else:
return "Latest snippets tagged with '%s'" % obj.name
return f"{SITE_NAME}: Latest snippets tagged with '{obj.name}'"
return f"Latest snippets tagged with '{obj.name}'"

def item_author_name(self, item):
return item.author.username
Expand Down
Loading