diff --git a/.github/actions/setup_project/action.yml b/.github/actions/setup_project/action.yml index beb091e2..975dbde9 100644 --- a/.github/actions/setup_project/action.yml +++ b/.github/actions/setup_project/action.yml @@ -45,7 +45,7 @@ runs: ${{ runner.os }}-poetry- - name: Install dependencies - run: poetry install -E testing -E docs + run: poetry install --with docs,tests shell: bash - name: Install xapian diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7cd386d5..74f18dd6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,15 +8,17 @@ on: workflow_dispatch: jobs: - black: - name: Black format + ruff: + name: Ruff lint & format runs-on: ubuntu-latest steps: - - name: Check out repository - uses: actions/checkout@v3 - - name: Setup Project - uses: ./.github/actions/setup_project - - run: poetry run black --check . + - uses: actions/checkout@v4 + - name: ruff format + uses: chartboost/ruff-action@v1 # format + with: + args: format --diff + - name: ruff check + uses: chartboost/ruff-action@v1 # lint tests: name: Run tests and generate coverage report diff --git a/accounting/admin.py b/accounting/admin.py index e485392d..95216e59 100644 --- a/accounting/admin.py +++ b/accounting/admin.py @@ -18,7 +18,6 @@ from django.contrib import admin from accounting.models import * - admin.site.register(BankAccount) admin.site.register(ClubAccount) admin.site.register(GeneralJournal) diff --git a/accounting/migrations/0001_initial.py b/accounting/migrations/0001_initial.py index 51add331..b5112cdd 100644 --- a/accounting/migrations/0001_initial.py +++ b/accounting/migrations/0001_initial.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.core.validators -import accounting.models import django.db.models.deletion +from django.db import migrations, models + +import accounting.models class Migration(migrations.Migration): diff --git a/accounting/migrations/0002_auto_20160824_2152.py b/accounting/migrations/0002_auto_20160824_2152.py index b0cc051f..d331dd5c 100644 --- a/accounting/migrations/0002_auto_20160824_2152.py +++ b/accounting/migrations/0002_auto_20160824_2152.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/accounting/migrations/0003_auto_20160824_2203.py b/accounting/migrations/0003_auto_20160824_2203.py index 597f582f..cf53223f 100644 --- a/accounting/migrations/0003_auto_20160824_2203.py +++ b/accounting/migrations/0003_auto_20160824_2203.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import phonenumber_field.modelfields +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/accounting/migrations/0004_auto_20161005_1505.py b/accounting/migrations/0004_auto_20161005_1505.py index 993754bd..6e122f7d 100644 --- a/accounting/migrations/0004_auto_20161005_1505.py +++ b/accounting/migrations/0004_auto_20161005_1505.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/accounting/models.py b/accounting/models.py index e10a029d..55bdda46 100644 --- a/accounting/models.py +++ b/accounting/models.py @@ -14,19 +14,19 @@ # # -from django.urls import reverse -from django.core.exceptions import ValidationError -from django.core import validators -from django.db import models -from django.conf import settings -from django.utils.translation import gettext_lazy as _ -from django.template import defaultfilters +from decimal import Decimal +from django.conf import settings +from django.core import validators +from django.core.exceptions import ValidationError +from django.db import models +from django.template import defaultfilters +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from phonenumber_field.modelfields import PhoneNumberField -from decimal import Decimal -from core.models import User, SithFile from club.models import Club +from core.models import SithFile, User class CurrencyField(models.DecimalField): diff --git a/accounting/tests.py b/accounting/tests.py index 6a4ae2b3..28c7a420 100644 --- a/accounting/tests.py +++ b/accounting/tests.py @@ -14,19 +14,19 @@ # # -from django.test import TestCase -from django.urls import reverse -from django.core.management import call_command from datetime import date, timedelta -from core.models import User +from django.test import TestCase +from django.urls import reverse + from accounting.models import ( - GeneralJournal, - Operation, - Label, AccountingType, + GeneralJournal, + Label, + Operation, SimplifiedAccountingType, ) +from core.models import User class RefoundAccountTest(TestCase): diff --git a/accounting/views.py b/accounting/views.py index 7182ec83..f9618beb 100644 --- a/accounting/views.py +++ b/accounting/views.py @@ -14,41 +14,41 @@ # # -from django.views.generic import ListView, DetailView -from django.views.generic.edit import UpdateView, CreateView, DeleteView, FormView -from django.urls import reverse_lazy, reverse -from django.utils.translation import gettext_lazy as _ -from django.forms.models import modelform_factory -from django.core.exceptions import PermissionDenied, ValidationError -from django.forms import HiddenInput -from django.db import transaction -from django.db.models import Sum -from django.conf import settings -from django import forms -from django.http import HttpResponse import collections from ajax_select.fields import AutoCompleteSelectField +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied, ValidationError +from django.db import transaction +from django.db.models import Sum +from django.forms import HiddenInput +from django.forms.models import modelform_factory +from django.http import HttpResponse +from django.urls import reverse, reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView +from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView -from core.views import ( - CanViewMixin, - CanEditMixin, - CanEditPropMixin, - CanCreateMixin, - TabedViewMixin, -) -from core.views.forms import SelectFile, SelectDate from accounting.models import ( + AccountingType, BankAccount, ClubAccount, - GeneralJournal, - Operation, - AccountingType, Company, - SimplifiedAccountingType, + GeneralJournal, Label, + Operation, + SimplifiedAccountingType, ) -from counter.models import Counter, Selling, Product +from core.views import ( + CanCreateMixin, + CanEditMixin, + CanEditPropMixin, + CanViewMixin, + TabedViewMixin, +) +from core.views.forms import SelectDate, SelectFile +from counter.models import Counter, Product, Selling # Main accounting view @@ -521,14 +521,14 @@ class OperationPDFView(CanViewMixin, DetailView): pk_url_kwarg = "op_id" def get(self, request, *args, **kwargs): - from reportlab.pdfgen import canvas - from reportlab.lib.units import cm - from reportlab.platypus import Table, TableStyle from reportlab.lib import colors from reportlab.lib.pagesizes import letter + from reportlab.lib.units import cm from reportlab.lib.utils import ImageReader - from reportlab.pdfbase.ttfonts import TTFont from reportlab.pdfbase import pdfmetrics + from reportlab.pdfbase.ttfonts import TTFont + from reportlab.pdfgen import canvas + from reportlab.platypus import Table, TableStyle pdfmetrics.registerFont(TTFont("DejaVu", "DejaVuSerif.ttf")) @@ -599,7 +599,7 @@ class OperationPDFView(CanViewMixin, DetailView): payment_mode = "" for m in settings.SITH_ACCOUNTING_PAYMENT_METHOD: if m[0] == mode: - payment_mode += "[\u00D7]" + payment_mode += "[\u00d7]" else: payment_mode += "[ ]" payment_mode += " %s\n" % (m[1]) diff --git a/api/admin.py b/api/admin.py index 362a5c4f..5531f2a2 100644 --- a/api/admin.py +++ b/api/admin.py @@ -14,6 +14,4 @@ # # -from django.contrib import admin - # Register your models here. diff --git a/api/models.py b/api/models.py index 5672eba4..084dfa73 100644 --- a/api/models.py +++ b/api/models.py @@ -14,6 +14,4 @@ # # -from django.db import models - # Create your models here. diff --git a/api/tests.py b/api/tests.py index 46a200c2..d888e761 100644 --- a/api/tests.py +++ b/api/tests.py @@ -14,6 +14,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/api/urls.py b/api/urls.py index ca267eee..4dde736c 100644 --- a/api/urls.py +++ b/api/urls.py @@ -14,10 +14,10 @@ # # -from django.urls import re_path, path, include +from django.urls import include, path, re_path +from rest_framework import routers from api.views import * -from rest_framework import routers # Router config router = routers.DefaultRouter() diff --git a/api/views/__init__.py b/api/views/__init__.py index ae83fbe5..b0157985 100644 --- a/api/views/__init__.py +++ b/api/views/__init__.py @@ -14,13 +14,13 @@ # # -from rest_framework.response import Response -from rest_framework import viewsets from django.core.exceptions import PermissionDenied -from rest_framework.decorators import action from django.db.models.query import QuerySet +from rest_framework import viewsets +from rest_framework.decorators import action +from rest_framework.response import Response -from core.views import can_view, can_edit +from core.views import can_edit, can_view def check_if(obj, user, test): @@ -64,10 +64,10 @@ class RightModelViewSet(ManageModelMixin, viewsets.ModelViewSet): from .api import * -from .counter import * -from .user import * from .club import * +from .counter import * from .group import * from .launderette import * -from .uv import * from .sas import * +from .user import * +from .uv import * diff --git a/api/views/api.py b/api/views/api.py index 732ee654..4329a98b 100644 --- a/api/views/api.py +++ b/api/views/api.py @@ -14,9 +14,9 @@ # # -from rest_framework.response import Response from rest_framework.decorators import api_view, renderer_classes from rest_framework.renderers import StaticHTMLRenderer +from rest_framework.response import Response from core.templatetags.renderer import markdown diff --git a/api/views/club.py b/api/views/club.py index 24377073..a08d6c4f 100644 --- a/api/views/club.py +++ b/api/views/club.py @@ -14,17 +14,15 @@ # # -from rest_framework.response import Response +from django.conf import settings +from django.core.exceptions import PermissionDenied from rest_framework import serializers from rest_framework.decorators import api_view, renderer_classes from rest_framework.renderers import StaticHTMLRenderer - -from django.conf import settings -from django.core.exceptions import PermissionDenied - -from club.models import Club, Mailing +from rest_framework.response import Response from api.views import RightModelViewSet +from club.models import Club, Mailing class ClubSerializer(serializers.ModelSerializer): diff --git a/api/views/counter.py b/api/views/counter.py index 604cd986..2e633cae 100644 --- a/api/views/counter.py +++ b/api/views/counter.py @@ -15,12 +15,11 @@ # from rest_framework import serializers -from rest_framework.response import Response from rest_framework.decorators import action - -from counter.models import Counter +from rest_framework.response import Response from api.views import RightModelViewSet +from counter.models import Counter class CounterSerializer(serializers.ModelSerializer): diff --git a/api/views/group.py b/api/views/group.py index f6fd7594..a6aa7e2b 100644 --- a/api/views/group.py +++ b/api/views/group.py @@ -16,9 +16,8 @@ from rest_framework import serializers -from core.models import RealGroup - from api.views import RightModelViewSet +from core.models import RealGroup class GroupSerializer(serializers.ModelSerializer): diff --git a/api/views/launderette.py b/api/views/launderette.py index ab7fcf66..a1225274 100644 --- a/api/views/launderette.py +++ b/api/views/launderette.py @@ -15,12 +15,11 @@ # from rest_framework import serializers -from rest_framework.response import Response from rest_framework.decorators import action - -from launderette.models import Launderette, Machine, Token +from rest_framework.response import Response from api.views import RightModelViewSet +from launderette.models import Launderette, Machine, Token class LaunderettePlaceSerializer(serializers.ModelSerializer): diff --git a/api/views/sas.py b/api/views/sas.py index 063b9eab..455edf09 100644 --- a/api/views/sas.py +++ b/api/views/sas.py @@ -1,4 +1,5 @@ from typing import List + from rest_framework.decorators import api_view, renderer_classes from rest_framework.exceptions import PermissionDenied from rest_framework.generics import get_object_or_404 @@ -6,8 +7,8 @@ from rest_framework.renderers import JSONRenderer from rest_framework.request import Request from rest_framework.response import Response -from core.views import can_edit from core.models import User +from core.views import can_edit from sas.models import Picture diff --git a/api/views/user.py b/api/views/user.py index ed3b6b1a..a9ad19a6 100644 --- a/api/views/user.py +++ b/api/views/user.py @@ -17,12 +17,11 @@ import datetime from rest_framework import serializers -from rest_framework.response import Response from rest_framework.decorators import action - -from core.models import User +from rest_framework.response import Response from api.views import RightModelViewSet +from core.models import User class UserSerializer(serializers.ModelSerializer): diff --git a/api/views/uv.py b/api/views/uv.py index e9790e0b..a83a8936 100644 --- a/api/views/uv.py +++ b/api/views/uv.py @@ -1,11 +1,12 @@ -from rest_framework.response import Response +import json +import urllib.request + +from django.conf import settings +from django.core.exceptions import PermissionDenied +from rest_framework import serializers from rest_framework.decorators import api_view, renderer_classes from rest_framework.renderers import JSONRenderer -from django.core.exceptions import PermissionDenied -from django.conf import settings -from rest_framework import serializers -import urllib.request -import json +from rest_framework.response import Response from pedagogy.views import CanCreateUVFunctionMixin diff --git a/club/forms.py b/club/forms.py index dcf88ff5..ca6cb324 100644 --- a/club/forms.py +++ b/club/forms.py @@ -23,18 +23,15 @@ # # -from django.conf import settings +from ajax_select.fields import AutoCompleteSelectMultipleField from django import forms +from django.conf import settings from django.utils.translation import gettext_lazy as _ -from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField - -from club.models import Mailing, MailingSubscription, Club, Membership - +from club.models import Club, Mailing, MailingSubscription, Membership from core.models import User -from core.views.forms import SelectDate, SelectDateTime +from core.views.forms import SelectDate, TzAwareDateTimeField from counter.models import Counter -from core.views.forms import TzAwareDateTimeField class ClubEditForm(forms.ModelForm): diff --git a/club/migrations/0001_initial.py b/club/migrations/0001_initial.py index 55922e03..4a26270e 100644 --- a/club/migrations/0001_initial.py +++ b/club/migrations/0001_initial.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.core.validators import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0002_auto_20160824_2152.py b/club/migrations/0002_auto_20160824_2152.py index 6b69c1b7..ffc57443 100644 --- a/club/migrations/0002_auto_20160824_2152.py +++ b/club/migrations/0002_auto_20160824_2152.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0004_auto_20160915_1057.py b/club/migrations/0004_auto_20160915_1057.py index 3f08d9dd..8e0dc244 100644 --- a/club/migrations/0004_auto_20160915_1057.py +++ b/club/migrations/0004_auto_20160915_1057.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0005_auto_20161120_1149.py b/club/migrations/0005_auto_20161120_1149.py index 5fb949a7..b9eda617 100644 --- a/club/migrations/0005_auto_20161120_1149.py +++ b/club/migrations/0005_auto_20161120_1149.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0006_auto_20161229_0040.py b/club/migrations/0006_auto_20161229_0040.py index 290ecf5b..fec86868 100644 --- a/club/migrations/0006_auto_20161229_0040.py +++ b/club/migrations/0006_auto_20161229_0040.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0007_auto_20170324_0917.py b/club/migrations/0007_auto_20170324_0917.py index eb3c03cc..e356bac2 100644 --- a/club/migrations/0007_auto_20170324_0917.py +++ b/club/migrations/0007_auto_20170324_0917.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): diff --git a/club/migrations/0009_auto_20170822_2232.py b/club/migrations/0009_auto_20170822_2232.py index ce7dc337..4e679d09 100644 --- a/club/migrations/0009_auto_20170822_2232.py +++ b/club/migrations/0009_auto_20170822_2232.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import re + import django.core.validators import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/club/migrations/0010_auto_20170912_2028.py b/club/migrations/0010_auto_20170912_2028.py index a9b32d1b..0dbf796a 100644 --- a/club/migrations/0010_auto_20170912_2028.py +++ b/club/migrations/0010_auto_20170912_2028.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import django.db.models.deletion from django.db import migrations, models from club.models import Club from core.operations import PsqlRunOnly -import django.db.models.deletion def generate_club_pages(apps, schema_editor): diff --git a/club/migrations/0011_auto_20180426_2013.py b/club/migrations/0011_auto_20180426_2013.py index dc3234df..b1b1d362 100644 --- a/club/migrations/0011_auto_20180426_2013.py +++ b/club/migrations/0011_auto_20180426_2013.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -import club.models import django.db.models.deletion +from django.db import migrations, models + +import club.models class Migration(migrations.Migration): diff --git a/club/models.py b/club/models.py index 4d22b8e5..252dc085 100644 --- a/club/models.py +++ b/club/models.py @@ -24,21 +24,19 @@ # from typing import Optional -from django.core.cache import cache -from django.db import models -from django.core import validators from django.conf import settings +from django.core import validators +from django.core.cache import cache +from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.validators import RegexValidator, validate_email +from django.db import models, transaction from django.db.models import Q -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ -from django.core.exceptions import ValidationError, ObjectDoesNotExist -from django.db import transaction from django.urls import reverse from django.utils import timezone -from django.core.validators import RegexValidator, validate_email from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ -from core.models import User, MetaGroup, Group, SithFile, RealGroup, Notification, Page +from core.models import Group, MetaGroup, Notification, Page, RealGroup, SithFile, User # Create your models here. diff --git a/club/tests.py b/club/tests.py index 0cc05e89..73480979 100644 --- a/club/tests.py +++ b/club/tests.py @@ -18,15 +18,14 @@ from datetime import timedelta from django.conf import settings from django.core.cache import cache from django.test import TestCase -from django.utils import timezone, html -from django.utils.timezone import now, localtime -from django.utils.translation import gettext as _ from django.urls import reverse -from django.core.management import call_command +from django.utils import html, timezone +from django.utils.timezone import localtime, now +from django.utils.translation import gettext as _ -from core.models import User, AnonymousUser -from club.models import Club, Membership, Mailing from club.forms import MailingForm +from club.models import Club, Mailing, Membership +from core.models import AnonymousUser, User from sith.settings import SITH_BAR_MANAGER, SITH_MAIN_CLUB_ID @@ -861,8 +860,7 @@ class MailingFormTest(TestCase): reverse("club:mailing", kwargs={"club_id": self.bdf.id}), { "action": MailingForm.ACTION_REMOVE_SUBSCRIPTION, - "removal_%d" - % mde.id: [ + "removal_%d" % mde.id: [ user.id for user in mde.subscriptions.filter( user__in=[self.rbatsbak, self.comunity] diff --git a/club/views.py b/club/views.py index 2470cbb4..dce1c86f 100644 --- a/club/views.py +++ b/club/views.py @@ -26,50 +26,42 @@ import csv from django.conf import settings -from django import forms -from django.views.generic import ListView, DetailView, TemplateView, View -from django.views.generic.edit import DeleteView -from django.views.generic.detail import SingleObjectMixin -from django.views.generic.edit import UpdateView, CreateView +from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied, ValidationError +from django.core.paginator import InvalidPage, Paginator +from django.db.models import Sum from django.http import ( - HttpResponseRedirect, - HttpResponse, Http404, + HttpResponseRedirect, StreamingHttpResponse, ) +from django.shortcuts import get_object_or_404, redirect from django.urls import reverse, reverse_lazy from django.utils import timezone -from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext as _t -from django.core.exceptions import PermissionDenied, ValidationError, NON_FIELD_ERRORS -from django.core.paginator import Paginator, InvalidPage -from django.shortcuts import get_object_or_404, redirect -from django.db.models import Sum +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView, TemplateView, View +from django.views.generic.edit import CreateView, DeleteView, UpdateView - -from core.views import ( - CanCreateMixin, - CanViewMixin, - CanEditMixin, - CanEditPropMixin, - UserIsRootMixin, - TabedViewMixin, - PageEditViewBase, - DetailFormView, +from club.forms import ClubEditForm, ClubMemberForm, MailingForm, SellingsForm +from club.models import Club, Mailing, MailingSubscription, Membership +from com.views import ( + PosterCreateBaseView, + PosterDeleteBaseView, + PosterEditBaseView, + PosterListBaseView, ) from core.models import PageRev - -from counter.models import Selling - -from com.views import ( - PosterListBaseView, - PosterCreateBaseView, - PosterEditBaseView, - PosterDeleteBaseView, +from core.views import ( + CanCreateMixin, + CanEditMixin, + CanEditPropMixin, + CanViewMixin, + DetailFormView, + PageEditViewBase, + TabedViewMixin, + UserIsRootMixin, ) - -from club.models import Club, Membership, Mailing, MailingSubscription -from club.forms import MailingForm, ClubEditForm, ClubMemberForm, SellingsForm +from counter.models import Selling class ClubTabsMixin(TabedViewMixin): diff --git a/com/migrations/0002_news_newsdate.py b/com/migrations/0002_news_newsdate.py index da548fdc..51a378f3 100644 --- a/com/migrations/0002_news_newsdate.py +++ b/com/migrations/0002_news_newsdate.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/com/migrations/0003_auto_20170115_2300.py b/com/migrations/0003_auto_20170115_2300.py index 2087f40f..a21196b3 100644 --- a/com/migrations/0003_auto_20170115_2300.py +++ b/com/migrations/0003_auto_20170115_2300.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/com/migrations/0004_auto_20171221_1614.py b/com/migrations/0004_auto_20171221_1614.py index fe9539dc..6b4d4d9d 100644 --- a/com/migrations/0004_auto_20171221_1614.py +++ b/com/migrations/0004_auto_20171221_1614.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models +import django.db.models.deletion import django.utils.timezone from django.conf import settings -import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/com/models.py b/com/models.py index 71da8941..d7a31596 100644 --- a/com/models.py +++ b/com/models.py @@ -23,22 +23,20 @@ # # -from django.shortcuts import render +from django.conf import settings +from django.core.exceptions import ValidationError +from django.core.mail import EmailMultiAlternatives from django.db import models, transaction from django.db.models import Q -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.urls import reverse -from django.conf import settings +from django.shortcuts import render from django.templatetags.static import static -from django.core.mail import EmailMultiAlternatives -from django.core.exceptions import ValidationError - +from django.urls import reverse from django.utils import timezone +from django.utils.translation import gettext_lazy as _ -from core import utils -from core.models import User, Preferences, RealGroup, Notification, SithFile from club.models import Club +from core import utils +from core.models import Notification, Preferences, RealGroup, User class Sith(models.Model): diff --git a/com/tests.py b/com/tests.py index 6dde46db..0cd01a1d 100644 --- a/com/tests.py +++ b/com/tests.py @@ -13,18 +13,17 @@ # OR WITHIN THE LOCAL FILE "LICENSE" # # +from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase -from django.conf import settings from django.urls import reverse -from django.core.management import call_command from django.utils import html from django.utils.timezone import localtime, now from django.utils.translation import gettext as _ from club.models import Club, Membership -from com.models import Sith, News, Weekmail, WeekmailArticle, Poster -from core.models import User, RealGroup, AnonymousUser +from com.models import News, Poster, Sith, Weekmail, WeekmailArticle +from core.models import AnonymousUser, RealGroup, User class ComAlertTest(TestCase): diff --git a/com/views.py b/com/views.py index f8d0119b..774d1c5f 100644 --- a/com/views.py +++ b/com/views.py @@ -23,38 +23,35 @@ # # -from django.shortcuts import redirect, get_object_or_404 -from django.http import HttpResponseRedirect -from django.views.generic import ListView, DetailView, View -from django.views.generic.edit import UpdateView, CreateView, DeleteView -from django.views.generic.detail import SingleObjectMixin -from django.utils.translation import gettext_lazy as _ -from django.urls import reverse, reverse_lazy -from django.core.exceptions import ValidationError -from django.utils import timezone -from django.conf import settings -from django.db.models import Max -from django.forms.models import modelform_factory -from django.core.exceptions import PermissionDenied -from django import forms - from datetime import timedelta from smtplib import SMTPRecipientsRefused -from com.models import Sith, News, NewsDate, Weekmail, WeekmailArticle, Screen, Poster +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied, ValidationError +from django.db.models import Max +from django.forms.models import modelform_factory +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse, reverse_lazy +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView, View +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import CreateView, DeleteView, UpdateView + +from club.models import Club, Mailing +from com.models import News, NewsDate, Poster, Screen, Sith, Weekmail, WeekmailArticle +from core.models import Notification, RealGroup, User from core.views import ( - CanViewMixin, + CanCreateMixin, CanEditMixin, CanEditPropMixin, - TabedViewMixin, - CanCreateMixin, + CanViewMixin, QuickNotifMixin, + TabedViewMixin, ) -from core.views.forms import SelectDateTime, MarkdownInput -from core.models import Notification, RealGroup, User -from club.models import Club, Mailing -from core.views.forms import TzAwareDateTimeField - +from core.views.forms import MarkdownInput, TzAwareDateTimeField # Sith object diff --git a/core/admin.py b/core/admin.py index 33ce50e4..8b202a30 100644 --- a/core/admin.py +++ b/core/admin.py @@ -14,12 +14,12 @@ # # -from django.contrib import admin from ajax_select import make_ajax_form -from core.models import User, Page, RealGroup, MetaGroup, SithFile +from django.contrib import admin from django.contrib.auth.models import Group as AuthGroup from haystack.admin import SearchModelAdmin +from core.models import MetaGroup, Page, RealGroup, SithFile, User admin.site.unregister(AuthGroup) admin.site.register(MetaGroup) diff --git a/core/apps.py b/core/apps.py index cd131f57..872f34ae 100644 --- a/core/apps.py +++ b/core/apps.py @@ -34,8 +34,8 @@ class SithConfig(AppConfig): verbose_name = "Core app of the Sith" def ready(self): + import core.signals # noqa F401 from forum.models import Forum - import core.signals cache.clear() diff --git a/core/converters.py b/core/converters.py index cb7bc95b..b681564d 100644 --- a/core/converters.py +++ b/core/converters.py @@ -1,6 +1,3 @@ -from core.models import Page - - class FourDigitYearConverter: regex = "[0-9]{4}" diff --git a/core/lookups.py b/core/lookups.py index f245442b..15205194 100644 --- a/core/lookups.py +++ b/core/lookups.py @@ -14,15 +14,14 @@ # # +from ajax_select import LookupChannel, register from django.core.exceptions import PermissionDenied -from ajax_select import register, LookupChannel -from core.views.site import search_user -from core.models import User, Group, SithFile -from club.models import Club -from counter.models import Product, Counter, Customer from accounting.models import ClubAccount, Company -from eboutic.models import BasketItem +from club.models import Club +from core.models import Group, SithFile, User +from core.views.site import search_user +from counter.models import Counter, Customer, Product def check_token(request): diff --git a/core/management/commands/check_fs.py b/core/management/commands/check_fs.py index 7ebc076d..a6fc9597 100644 --- a/core/management/commands/check_fs.py +++ b/core/management/commands/check_fs.py @@ -23,8 +23,8 @@ # import os + from django.core.management.base import BaseCommand -from django.core.management import call_command from core.models import SithFile diff --git a/core/management/commands/compilemessages.py b/core/management/commands/compilemessages.py index b3c336bc..87f1b2de 100644 --- a/core/management/commands/compilemessages.py +++ b/core/management/commands/compilemessages.py @@ -25,6 +25,7 @@ import os + from django.core.management.commands import compilemessages diff --git a/core/management/commands/compilestatic.py b/core/management/commands/compilestatic.py index 31e5c13e..f1268c23 100644 --- a/core/management/commands/compilestatic.py +++ b/core/management/commands/compilestatic.py @@ -24,9 +24,10 @@ # import os + import sass -from django.core.management.base import BaseCommand from django.conf import settings +from django.core.management.base import BaseCommand class Command(BaseCommand): diff --git a/core/management/commands/documentation.py b/core/management/commands/documentation.py index 79f2e0d8..bcaa0664 100644 --- a/core/management/commands/documentation.py +++ b/core/management/commands/documentation.py @@ -24,10 +24,9 @@ # import os -import sys import signal - -from http.server import test, CGIHTTPRequestHandler +import sys +from http.server import CGIHTTPRequestHandler, test from django.core.management.base import BaseCommand from django.utils import autoreload diff --git a/core/management/commands/install_xapian.py b/core/management/commands/install_xapian.py index b2009cd4..9181c151 100644 --- a/core/management/commands/install_xapian.py +++ b/core/management/commands/install_xapian.py @@ -15,11 +15,12 @@ # import os -import tomli import subprocess -from django.core.management.base import BaseCommand, CommandParser from pathlib import Path +import tomli +from django.core.management.base import BaseCommand, CommandParser + class Command(BaseCommand): help = "Install xapian" diff --git a/core/management/commands/markdown.py b/core/management/commands/markdown.py index 1b5a6855..35941ec4 100644 --- a/core/management/commands/markdown.py +++ b/core/management/commands/markdown.py @@ -23,6 +23,7 @@ # import os + from django.core.management.base import BaseCommand from core.markdown import markdown diff --git a/core/management/commands/populate.py b/core/management/commands/populate.py index c78de401..a9285653 100644 --- a/core/management/commands/populate.py +++ b/core/management/commands/populate.py @@ -24,38 +24,37 @@ import os from datetime import date, datetime, timedelta -from io import StringIO, BytesIO +from io import BytesIO, StringIO from pathlib import Path -from django.contrib.auth.models import Permission -from django.core.management.base import BaseCommand -from django.core.management import call_command from django.conf import settings -from django.db import connection +from django.contrib.auth.models import Permission from django.contrib.sites.models import Site +from django.core.management import call_command +from django.core.management.base import BaseCommand +from django.db import connection from django.utils import timezone - from PIL import Image -from core.models import Group, User, Page, PageRev, SithFile from accounting.models import ( - GeneralJournal, + AccountingType, BankAccount, ClubAccount, - Operation, - AccountingType, - SimplifiedAccountingType, Company, + GeneralJournal, + Operation, + SimplifiedAccountingType, ) -from core.utils import resize_image from club.models import Club, Membership -from subscription.models import Subscription -from counter.models import Customer, ProductType, Product, Counter, Selling, StudentCard -from com.models import Sith, Weekmail, News, NewsDate -from election.models import Election, Role, Candidature, ElectionList +from com.models import News, NewsDate, Sith, Weekmail +from core.models import Group, Page, PageRev, SithFile, User +from core.utils import resize_image +from counter.models import Counter, Customer, Product, ProductType, Selling, StudentCard +from election.models import Candidature, Election, ElectionList, Role from forum.models import Forum, ForumTopic from pedagogy.models import UV -from sas.models import Album, Picture, PeoplePictureRelation +from sas.models import Album, PeoplePictureRelation, Picture +from subscription.models import Subscription class Command(BaseCommand): diff --git a/core/management/commands/repair_fs.py b/core/management/commands/repair_fs.py index 055dbc9b..21408084 100644 --- a/core/management/commands/repair_fs.py +++ b/core/management/commands/repair_fs.py @@ -23,8 +23,8 @@ # import os + from django.core.management.base import BaseCommand -from django.core.management import call_command from core.models import SithFile diff --git a/core/management/commands/setup.py b/core/management/commands/setup.py index cc0ee1ca..5c91e1e6 100644 --- a/core/management/commands/setup.py +++ b/core/management/commands/setup.py @@ -15,8 +15,9 @@ # import os -from django.core.management.base import BaseCommand + from django.core.management import call_command +from django.core.management.base import BaseCommand class Command(BaseCommand): diff --git a/core/markdown.py b/core/markdown.py index 72b1cd02..0abe1954 100644 --- a/core/markdown.py +++ b/core/markdown.py @@ -16,8 +16,9 @@ import os import re -from mistune import Renderer, InlineGrammar, InlineLexer, Markdown, escape, escape_link + from django.urls import reverse +from mistune import InlineGrammar, InlineLexer, Markdown, Renderer, escape, escape_link class SithRenderer(Renderer): diff --git a/core/middleware.py b/core/middleware.py index 39afa266..ddc6dea3 100644 --- a/core/middleware.py +++ b/core/middleware.py @@ -16,12 +16,13 @@ import importlib import threading + from django.conf import settings -from django.utils.functional import SimpleLazyObject from django.contrib.auth import get_user from django.contrib.auth.middleware import ( AuthenticationMiddleware as DjangoAuthenticationMiddleware, ) +from django.utils.functional import SimpleLazyObject module, klass = settings.AUTH_ANONYMOUS_MODEL.rsplit(".", 1) AnonymousUser = getattr(importlib.import_module(module), klass) diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index 7474e93a..57050f26 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.contrib.auth.models -import django.db.models.deletion import django.core.validators -import core.models +import django.db.models.deletion import phonenumber_field.modelfields from django.conf import settings -import django.db.models.deletion +from django.db import migrations, models + +import core.models class Migration(migrations.Migration): diff --git a/core/migrations/0003_auto_20160902_1914.py b/core/migrations/0003_auto_20160902_1914.py index b39d9838..65f11d3a 100644 --- a/core/migrations/0003_auto_20160902_1914.py +++ b/core/migrations/0003_auto_20160902_1914.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.core.validators +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0004_user_godfathers.py b/core/migrations/0004_user_godfathers.py index d068cfc7..d4066cc5 100644 --- a/core/migrations/0004_user_godfathers.py +++ b/core/migrations/0004_user_godfathers.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0005_auto_20161105_1035.py b/core/migrations/0005_auto_20161105_1035.py index 7d40b163..6f7c487f 100644 --- a/core/migrations/0005_auto_20161105_1035.py +++ b/core/migrations/0005_auto_20161105_1035.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0009_auto_20161120_1155.py b/core/migrations/0009_auto_20161120_1155.py index c017706a..aafb2c54 100644 --- a/core/migrations/0009_auto_20161120_1155.py +++ b/core/migrations/0009_auto_20161120_1155.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models + import core.models diff --git a/core/migrations/0011_auto_20161124_0848.py b/core/migrations/0011_auto_20161124_0848.py index b3ea7f4a..6475189e 100644 --- a/core/migrations/0011_auto_20161124_0848.py +++ b/core/migrations/0011_auto_20161124_0848.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.utils.timezone +from django.db import migrations, models + import core.models diff --git a/core/migrations/0012_notification.py b/core/migrations/0012_notification.py index 360fbcb8..245a38e3 100644 --- a/core/migrations/0012_notification.py +++ b/core/migrations/0012_notification.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings -import django.utils.timezone import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0015_sithfile_moderator.py b/core/migrations/0015_sithfile_moderator.py index 20d1512f..4e2a438d 100644 --- a/core/migrations/0015_sithfile_moderator.py +++ b/core/migrations/0015_sithfile_moderator.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0016_auto_20161212_1922.py b/core/migrations/0016_auto_20161212_1922.py index bde89b82..72432467 100644 --- a/core/migrations/0016_auto_20161212_1922.py +++ b/core/migrations/0016_auto_20161212_1922.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0020_auto_20170324_0917.py b/core/migrations/0020_auto_20170324_0917.py index c026483a..219be979 100644 --- a/core/migrations/0020_auto_20170324_0917.py +++ b/core/migrations/0020_auto_20170324_0917.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.core.validators +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0023_auto_20170902_1226.py b/core/migrations/0023_auto_20170902_1226.py index 2cdc4c85..9bfd01ed 100644 --- a/core/migrations/0023_auto_20170902_1226.py +++ b/core/migrations/0023_auto_20170902_1226.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0025_auto_20170919_1521.py b/core/migrations/0025_auto_20170919_1521.py index f37a829b..f7bd278c 100644 --- a/core/migrations/0025_auto_20170919_1521.py +++ b/core/migrations/0025_auto_20170919_1521.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.core.validators +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0027_gift.py b/core/migrations/0027_gift.py index 21bf8442..ca8ce67b 100644 --- a/core/migrations/0027_gift.py +++ b/core/migrations/0027_gift.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings -import django.utils.timezone import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/core/migrations/0029_auto_20180426_2013.py b/core/migrations/0029_auto_20180426_2013.py index eadfd558..c591f47b 100644 --- a/core/migrations/0029_auto_20180426_2013.py +++ b/core/migrations/0029_auto_20180426_2013.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -import core.models import django.db.models.deletion +from django.db import migrations, models + +import core.models class Migration(migrations.Migration): diff --git a/core/migrations/0034_operationlog.py b/core/migrations/0034_operationlog.py index df59cd6a..505e2332 100644 --- a/core/migrations/0034_operationlog.py +++ b/core/migrations/0034_operationlog.py @@ -1,8 +1,8 @@ # Generated by Django 2.2.6 on 2019-11-14 15:10 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/core/models.py b/core/models.py index c8a38426..4fba43c3 100644 --- a/core/models.py +++ b/core/models.py @@ -23,36 +23,39 @@ # # import importlib -from typing import Union, Optional, List +import os +import unicodedata +from datetime import date, timedelta +from typing import List, Optional, Union -from django.core.cache import cache -from django.core.mail import send_mail +from django.conf import settings from django.contrib.auth.models import ( AbstractBaseUser, UserManager, - Group as AuthGroup, - GroupManager as AuthGroupManager, +) +from django.contrib.auth.models import ( AnonymousUser as AuthAnonymousUser, ) -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.core import validators -from django.core.exceptions import ValidationError, PermissionDenied -from django.urls import reverse -from django.conf import settings -from django.db import models, transaction +from django.contrib.auth.models import ( + Group as AuthGroup, +) +from django.contrib.auth.models import ( + GroupManager as AuthGroupManager, +) from django.contrib.staticfiles.storage import staticfiles_storage -from django.utils.html import escape +from django.core import validators +from django.core.cache import cache +from django.core.exceptions import PermissionDenied, ValidationError +from django.core.mail import send_mail +from django.db import models, transaction +from django.urls import reverse +from django.utils import timezone from django.utils.functional import cached_property - -import os -from core import utils - +from django.utils.html import escape +from django.utils.translation import gettext_lazy as _ from phonenumber_field.modelfields import PhoneNumberField -from datetime import timedelta, date - -import unicodedata +from core import utils class RealGroupManager(AuthGroupManager): @@ -698,9 +701,11 @@ class User(AbstractBaseUser): %s """ % ( - self.profile_pict.get_download_url() - if self.profile_pict - else staticfiles_storage.url("core/img/unknown.jpg"), + ( + self.profile_pict.get_download_url() + if self.profile_pict + else staticfiles_storage.url("core/img/unknown.jpg") + ), _("Profile"), escape(self.get_display_name()), ) diff --git a/core/operations.py b/core/operations.py index 29740292..10882f22 100644 --- a/core/operations.py +++ b/core/operations.py @@ -23,9 +23,9 @@ # """ - This page is useful for custom migration tricks. - Sometimes, when you need to have a migration hack and you think it can be - useful again, put it there, we never know if we might need the hack again. +This page is useful for custom migration tricks. +Sometimes, when you need to have a migration hack and you think it can be +useful again, put it there, we never know if we might need the hack again. """ from django.db import connection, migrations diff --git a/core/scss/finder.py b/core/scss/finder.py index 3e25279f..0b62fab3 100644 --- a/core/scss/finder.py +++ b/core/scss/finder.py @@ -25,6 +25,7 @@ import os from collections import OrderedDict + from django.conf import settings from django.contrib.staticfiles.finders import FileSystemFinder from django.core.files.storage import FileSystemStorage diff --git a/core/scss/processor.py b/core/scss/processor.py index 6aa334f2..add5e042 100644 --- a/core/scss/processor.py +++ b/core/scss/processor.py @@ -24,12 +24,14 @@ # import os -import sass from urllib.parse import urljoin -from django.utils.encoding import force_bytes, iri_to_uri + +import sass +from django.conf import settings from django.core.files.base import ContentFile from django.templatetags.static import static -from django.conf import settings +from django.utils.encoding import force_bytes, iri_to_uri + from core.scss.storage import ScssFileStorage, find_file diff --git a/core/search_indexes.py b/core/search_indexes.py index b98dc67b..f2448adb 100644 --- a/core/search_indexes.py +++ b/core/search_indexes.py @@ -24,7 +24,6 @@ # from django.db import models - from haystack import indexes, signals from core.models import User diff --git a/core/signals.py b/core/signals.py index 7cda36c7..23e38599 100644 --- a/core/signals.py +++ b/core/signals.py @@ -8,10 +8,10 @@ from core.models import User @receiver(m2m_changed, sender=User.groups.through, dispatch_uid="user_groups_changed") def user_groups_changed(sender, instance: User, **kwargs): """ - Clear the cached clubs of the user + Clear the cached groups of the user """ # As a m2m relationship doesn't live within the model # but rather on an intermediary table, there is no # model method to override, meaning we must use - # a signal to invalidate the cache when a user is removed from a club - cache.delete(f"user_{instance.id}_groups") + # a signal to invalidate the cache when a user is removed from a group + cache.delete(f"user_{instance.pk}_groups") diff --git a/core/templatetags/renderer.py b/core/templatetags/renderer.py index 2ee19a45..86bd6791 100644 --- a/core/templatetags/renderer.py +++ b/core/templatetags/renderer.py @@ -24,15 +24,15 @@ # import datetime -import phonenumbers +import phonenumbers from django import template from django.template.defaultfilters import stringfilter from django.utils.safestring import mark_safe from django.utils.translation import ngettext -from core.scss.processor import ScssProcessor from core.markdown import markdown as md +from core.scss.processor import ScssProcessor register = template.Library() diff --git a/core/templatetags/search_helpers.py b/core/templatetags/search_helpers.py index 537ff357..d38574df 100644 --- a/core/templatetags/search_helpers.py +++ b/core/templatetags/search_helpers.py @@ -1,6 +1,6 @@ -from django.template.exceptions import TemplateSyntaxError from django import template from django.template.defaultfilters import stringfilter +from django.template.exceptions import TemplateSyntaxError register = template.Library() diff --git a/core/urls.py b/core/urls.py index ec42f880..3f6398e8 100644 --- a/core/urls.py +++ b/core/urls.py @@ -25,12 +25,12 @@ from django.urls import path, re_path, register_converter -from core.views import * from core.converters import ( + BooleanStringConverter, FourDigitYearConverter, TwoDigitMonthConverter, - BooleanStringConverter, ) +from core.views import * register_converter(FourDigitYearConverter, "yyyy") register_converter(TwoDigitMonthConverter, "mm") diff --git a/core/utils.py b/core/utils.py index d30e3ebf..62cf04bb 100644 --- a/core/utils.py +++ b/core/utils.py @@ -26,8 +26,8 @@ from typing import Optional import PIL from django.conf import settings from django.core.files.base import ContentFile -from PIL import ExifTags from django.utils import timezone +from PIL import ExifTags def get_git_revision_short_hash() -> str: diff --git a/core/views/__init__.py b/core/views/__init__.py index fc807663..ad86fe2d 100644 --- a/core/views/__init__.py +++ b/core/views/__init__.py @@ -25,26 +25,21 @@ import types -from sentry_sdk import last_event_id -from django.shortcuts import render +from django.core.exceptions import ( + ImproperlyConfigured, + PermissionDenied, +) from django.http import ( HttpResponseForbidden, HttpResponseNotFound, HttpResponseServerError, ) -from django.template import RequestContext -from django.core.exceptions import ( - PermissionDenied, - ObjectDoesNotExist, - ImproperlyConfigured, -) -from django.views.generic.base import View -from django.views.generic.edit import FormView -from django.views.generic.detail import SingleObjectMixin from django.utils.functional import cached_property -from django.db.models import Count +from django.views.generic.base import View +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import FormView +from sentry_sdk import last_event_id -from core.models import Group from core.views.forms import LoginForm @@ -314,9 +309,8 @@ class QuickNotifMixin: quick_notif_list = [] def dispatch(self, request, *arg, **kwargs): - self.quick_notif_list = ( - [] - ) # In some cases, the class can stay instanciated, so we need to reset the list + # In some cases, the class can stay instanciated, so we need to reset the list + self.quick_notif_list = [] return super(QuickNotifMixin, self).dispatch(request, *arg, **kwargs) def get_success_url(self): @@ -362,8 +356,8 @@ class DetailFormView(SingleObjectMixin, FormView): return super(DetailFormView, self).get_object() -from .user import * -from .page import * from .files import * -from .site import * from .group import * +from .page import * +from .site import * +from .user import * diff --git a/core/views/files.py b/core/views/files.py index 986477ab..7cce06e7 100644 --- a/core/views/files.py +++ b/core/views/files.py @@ -15,29 +15,28 @@ # # This file contains all the views that concern the page model -from django.shortcuts import redirect, get_object_or_404 -from django.utils.http import http_date -from django.views.generic import ListView, DetailView, TemplateView -from django.views.generic.edit import UpdateView, FormMixin, DeleteView -from django.views.generic.detail import SingleObjectMixin -from django.forms.models import modelform_factory -from django.conf import settings -from django.utils.translation import gettext_lazy as _ -from django.http import Http404, HttpResponse -from wsgiref.util import FileWrapper -from django.urls import reverse -from django.core.exceptions import PermissionDenied -from django import forms - import os +from wsgiref.util import FileWrapper from ajax_select import make_ajax_field +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.forms.models import modelform_factory +from django.http import Http404, HttpResponse +from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse +from django.utils.http import http_date +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView, TemplateView +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import DeleteView, FormMixin, UpdateView -from core.models import SithFile, RealGroup, Notification +from core.models import Notification, RealGroup, SithFile from core.views import ( - CanViewMixin, CanEditMixin, CanEditPropMixin, + CanViewMixin, can_view, ) from counter.models import Counter @@ -97,12 +96,10 @@ class _MultipleFieldMixin: return result -class MultipleFileField(_MultipleFieldMixin, forms.FileField): - ... +class MultipleFileField(_MultipleFieldMixin, forms.FileField): ... -class MultipleImageField(_MultipleFieldMixin, forms.ImageField): - ... +class MultipleImageField(_MultipleFieldMixin, forms.ImageField): ... class AddFilesForm(forms.Form): diff --git a/core/views/forms.py b/core/views/forms.py index 936abb26..5426ef14 100644 --- a/core/views/forms.py +++ b/core/views/forms.py @@ -21,40 +21,37 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # +import datetime +import re +from io import BytesIO + +from ajax_select import make_ajax_field +from ajax_select.fields import AutoCompleteSelectField from captcha.fields import CaptchaField -from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django import forms from django.conf import settings -from django.db import transaction -from django.templatetags.static import static -from django.urls import reverse +from django.contrib.auth.forms import AuthenticationForm, UserCreationForm from django.core.exceptions import ValidationError +from django.db import transaction from django.forms import ( CheckboxSelectMultiple, - Select, DateInput, - TextInput, DateTimeInput, Textarea, + TextInput, ) -from django.utils.translation import gettext_lazy as _ -from django.utils.translation import gettext -from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget -from ajax_select.fields import AutoCompleteSelectField -from ajax_select import make_ajax_field -from django.utils.dateparse import parse_datetime -from django.utils import timezone -import datetime from django.forms.utils import to_current_timezone - -import re - -from core.models import User, Page, SithFile, Gift - -from core.utils import resize_image -from io import BytesIO +from django.templatetags.static import static +from django.urls import reverse +from django.utils import timezone +from django.utils.dateparse import parse_datetime +from django.utils.translation import gettext +from django.utils.translation import gettext_lazy as _ +from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget from PIL import Image +from core.models import Gift, Page, SithFile, User +from core.utils import resize_image # Widgets diff --git a/core/views/group.py b/core/views/group.py index a6b61866..1c598832 100644 --- a/core/views/group.py +++ b/core/views/group.py @@ -15,18 +15,15 @@ # """ - This module contains views to manage Groups +This module contains views to manage Groups """ -from django.views.generic.edit import UpdateView, CreateView, DeleteView -from django.views.generic import ListView -from django.views.generic.edit import FormView -from django.urls import reverse_lazy -from django.shortcuts import get_object_or_404 -from django.utils.translation import gettext_lazy as _ -from django import forms - from ajax_select.fields import AutoCompleteSelectMultipleField +from django import forms +from django.urls import reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic import ListView +from django.views.generic.edit import CreateView, DeleteView, UpdateView from core.models import RealGroup, User from core.views import CanCreateMixin, CanEditMixin, DetailFormView diff --git a/core/views/page.py b/core/views/page.py index c2c7dbce..5f148235 100644 --- a/core/views/page.py +++ b/core/views/page.py @@ -15,16 +15,16 @@ # # This file contains all the views that concern the page model -from django.urls import reverse_lazy -from django.views.generic import ListView, DetailView -from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.forms.models import modelform_factory from django.http import Http404 from django.shortcuts import redirect +from django.urls import reverse_lazy +from django.views.generic import DetailView, ListView +from django.views.generic.edit import CreateView, DeleteView, UpdateView -from core.models import Page, PageRev, LockError +from core.models import LockError, Page, PageRev +from core.views import CanCreateMixin, CanEditMixin, CanEditPropMixin, CanViewMixin from core.views.forms import MarkdownInput, PageForm, PagePropForm -from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin class CanEditPagePropMixin(CanEditPropMixin): diff --git a/core/views/site.py b/core/views/site.py index c34cf2c4..bdd575f4 100644 --- a/core/views/site.py +++ b/core/views/site.py @@ -23,23 +23,22 @@ # # -from django.shortcuts import render, redirect -from django.http import JsonResponse -from django.core import serializers -from django.contrib.auth.decorators import login_required -from django.utils import html -from django.views.generic import ListView, TemplateView -from django.conf import settings -from django.utils.text import slugify -from django.db.models.query import QuerySet - import json +from django.conf import settings +from django.contrib.auth.decorators import login_required +from django.core import serializers +from django.db.models.query import QuerySet +from django.http import JsonResponse +from django.shortcuts import redirect, render +from django.utils import html +from django.utils.text import slugify +from django.views.generic import ListView, TemplateView from haystack.query import SearchQuerySet -from core.models import User, Notification -from core.utils import doku_to_markdown, bbcode_to_markdown from club.models import Club +from core.models import Notification, User +from core.utils import bbcode_to_markdown, doku_to_markdown def index(request, context=None): @@ -100,9 +99,8 @@ def search_club(query, as_json=False): if query: clubs = Club.objects.filter(name__icontains=query).all() clubs = clubs[:5] - if ( - as_json - ): # Re-loads json to avoid double encoding by JsonResponse, but still benefit from serializers + if as_json: + # Re-loads json to avoid double encoding by JsonResponse, but still benefit from serializers clubs = json.loads(serializers.serialize("json", clubs, fields=("name"))) else: clubs = list(clubs) diff --git a/core/views/user.py b/core/views/user.py index dbd60f13..d8d8d909 100644 --- a/core/views/user.py +++ b/core/views/user.py @@ -24,50 +24,49 @@ # # This file contains all the views that concern the user model -from django.shortcuts import render, redirect, get_object_or_404 +import logging +from datetime import date, timedelta + +from django.conf import settings from django.contrib.auth import views from django.contrib.auth.forms import PasswordChangeForm -from django.utils.translation import gettext as _ -from django.urls import reverse from django.core.exceptions import PermissionDenied, ValidationError +from django.forms import CheckboxSelectMultiple +from django.forms.models import modelform_factory from django.http import Http404, HttpResponse -from django.views.generic.edit import UpdateView +from django.shortcuts import get_object_or_404, redirect, render +from django.template.response import TemplateResponse +from django.urls import reverse, reverse_lazy +from django.utils.translation import gettext as _ from django.views.generic import ( - ListView, - DetailView, - TemplateView, CreateView, DeleteView, + DetailView, + ListView, + TemplateView, ) -from django.forms.models import modelform_factory -from django.forms import CheckboxSelectMultiple -from django.urls import reverse_lazy -from django.template.response import TemplateResponse -from django.conf import settings -from django.views.generic.dates import YearMixin, MonthMixin +from django.views.generic.dates import MonthMixin, YearMixin +from django.views.generic.edit import UpdateView -from datetime import timedelta, date -import logging from api.views.sas import all_pictures_of_user - +from core.models import Gift, Preferences, SithFile, User from core.views import ( - CanViewMixin, CanEditMixin, CanEditPropMixin, - UserIsLoggedMixin, - TabedViewMixin, + CanViewMixin, QuickNotifMixin, + TabedViewMixin, + UserIsLoggedMixin, ) from core.views.forms import ( - RegisteringForm, - UserProfileForm, - LoginForm, - UserGodfathersForm, GiftForm, + LoginForm, + RegisteringForm, + UserGodfathersForm, + UserProfileForm, ) -from core.models import User, SithFile, Preferences, Gift -from subscription.models import Subscription from counter.forms import StudentCardForm +from subscription.models import Subscription from trombi.views import UserTrombiForm @@ -501,9 +500,10 @@ class UserStatsView(UserTabsMixin, CanViewMixin, DetailView): def get_context_data(self, **kwargs): kwargs = super(UserStatsView, self).get_context_data(**kwargs) - from counter.models import Counter from django.db.models import Sum + from counter.models import Counter + foyer = Counter.objects.filter(name="Foyer").first() mde = Counter.objects.filter(name="MDE").first() gommette = Counter.objects.filter(name="La Gommette").first() @@ -601,10 +601,12 @@ class UserUploadProfilePictView(CanEditMixin, DetailView): template_name = "core/user_edit.jinja" def post(self, request, *args, **kwargs): - from core.utils import resize_image from io import BytesIO + from PIL import Image + from core.utils import resize_image + self.object = self.get_object() if self.object.profile_pict: raise ValidationError(_("User already has a profile picture")) diff --git a/counter/app.py b/counter/app.py index c1feefe2..a1165d7c 100644 --- a/counter/app.py +++ b/counter/app.py @@ -31,4 +31,4 @@ class CounterConfig(AppConfig): verbose_name = _("counter") def ready(self): - import counter.signals + import counter.signals # noqa F401 diff --git a/counter/forms.py b/counter/forms.py index a09236e7..7c282f57 100644 --- a/counter/forms.py +++ b/counter/forms.py @@ -3,15 +3,15 @@ from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultip from django import forms from django.utils.translation import gettext_lazy as _ -from core.views.forms import TzAwareDateTimeField, SelectDate +from core.views.forms import SelectDate, TzAwareDateTimeField from counter.models import ( BillingInfo, - StudentCard, - Customer, - Refilling, Counter, - Product, + Customer, Eticket, + Product, + Refilling, + StudentCard, ) diff --git a/counter/migrations/0001_initial.py b/counter/migrations/0001_initial.py index e9635e5d..aa84e936 100644 --- a/counter/migrations/0001_initial.py +++ b/counter/migrations/0001_initial.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -import accounting.models import django.db.models.deletion from django.conf import settings -import django.db.models.deletion +from django.db import migrations, models + +import accounting.models class Migration(migrations.Migration): diff --git a/counter/migrations/0002_auto_20160826_1342.py b/counter/migrations/0002_auto_20160826_1342.py index ccc4288c..83e6a83a 100644 --- a/counter/migrations/0002_auto_20160826_1342.py +++ b/counter/migrations/0002_auto_20160826_1342.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings -import accounting.models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import accounting.models class Migration(migrations.Migration): diff --git a/counter/migrations/0003_permanency_activity.py b/counter/migrations/0003_permanency_activity.py index be4e9962..929d8308 100644 --- a/counter/migrations/0003_permanency_activity.py +++ b/counter/migrations/0003_permanency_activity.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import datetime + +from django.db import migrations, models from django.utils.timezone import utc diff --git a/counter/migrations/0005_auto_20160826_2330.py b/counter/migrations/0005_auto_20160826_2330.py index 8e0df744..9dc3fad9 100644 --- a/counter/migrations/0005_auto_20160826_2330.py +++ b/counter/migrations/0005_auto_20160826_2330.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/counter/migrations/0009_eticket.py b/counter/migrations/0009_eticket.py index 68b675ef..96d82e30 100644 --- a/counter/migrations/0009_eticket.py +++ b/counter/migrations/0009_eticket.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/counter/migrations/0013_customer_recorded_products.py b/counter/migrations/0013_customer_recorded_products.py index d6b3cfa8..271491eb 100644 --- a/counter/migrations/0013_customer_recorded_products.py +++ b/counter/migrations/0013_customer_recorded_products.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.utils.translation import gettext_lazy as _ -from django.db import migrations, models from django.conf import settings +from django.db import migrations, models +from django.utils.translation import gettext_lazy as _ from core.models import User -from counter.models import Customer, Product, Selling, Counter +from counter.models import Counter, Customer, Product, Selling def balance_ecocups(apps, schema_editor): diff --git a/counter/migrations/0015_merge.py b/counter/migrations/0015_merge.py index 6dcff021..eba94807 100644 --- a/counter/migrations/0015_merge.py +++ b/counter/migrations/0015_merge.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): diff --git a/counter/migrations/0017_studentcard.py b/counter/migrations/0017_studentcard.py index a2f62222..267cef25 100644 --- a/counter/migrations/0017_studentcard.py +++ b/counter/migrations/0017_studentcard.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/counter/migrations/0019_billinginfo.py b/counter/migrations/0019_billinginfo.py index c4c74c39..b348c86a 100644 --- a/counter/migrations/0019_billinginfo.py +++ b/counter/migrations/0019_billinginfo.py @@ -1,8 +1,8 @@ # Generated by Django 3.2.16 on 2023-01-08 12:49 -from django.db import migrations, models import django.db.models.deletion import django_countries.fields +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/counter/migrations/0020_auto_20221215_1709.py b/counter/migrations/0020_auto_20221215_1709.py index 52010133..22db406b 100644 --- a/counter/migrations/0020_auto_20221215_1709.py +++ b/counter/migrations/0020_auto_20221215_1709.py @@ -1,8 +1,9 @@ # Generated by Django 3.2.16 on 2022-12-15 16:09 -import accounting.models from django.db import migrations +import accounting.models + class Migration(migrations.Migration): dependencies = [ diff --git a/counter/models.py b/counter/models.py index 476aaf13..c9972f10 100644 --- a/counter/models.py +++ b/counter/models.py @@ -15,35 +15,33 @@ # from __future__ import annotations -from typing import Tuple, Optional - -from django.db import models -from django.db.models import F, Value, Sum, QuerySet, OuterRef, Exists -from django.db.models.functions import Concat, Length -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.conf import settings -from django.urls import reverse -from django.core.validators import MinLengthValidator -from django.forms import ValidationError -from django.utils.functional import cached_property - -from datetime import timedelta, date, datetime +import base64 +import os import random import string -import os -import base64 -from dict2xml import dict2xml +from datetime import date, datetime, timedelta +from typing import Optional, Tuple +from dict2xml import dict2xml +from django.conf import settings +from django.core.validators import MinLengthValidator +from django.db import models +from django.db.models import Exists, F, OuterRef, QuerySet, Sum, Value +from django.db.models.functions import Concat, Length +from django.forms import ValidationError +from django.urls import reverse +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ +from django_countries.fields import CountryField + +from accounting.models import CurrencyField +from club.models import Club +from core.models import Group, Notification, User from core.utils import get_start_of_semester from sith.settings import SITH_COUNTER_OFFICES, SITH_MAIN_CLUB -from club.models import Club, Membership -from accounting.models import CurrencyField -from core.models import Group, User, Notification from subscription.models import Subscription -from django_countries.fields import CountryField - class Customer(models.Model): """ diff --git a/counter/signals.py b/counter/signals.py index 9c1f4b78..9221494d 100644 --- a/counter/signals.py +++ b/counter/signals.py @@ -24,12 +24,10 @@ from django.db.models.signals import pre_delete from django.dispatch import receiver -from django.conf import settings from core.middleware import get_signal_request from core.models import OperationLog - -from counter.models import Selling, Refilling, Counter +from counter.models import Counter, Refilling, Selling def write_log(instance, operation_type): diff --git a/counter/tests.py b/counter/tests.py index 6079099a..f921a5d4 100644 --- a/counter/tests.py +++ b/counter/tests.py @@ -13,20 +13,18 @@ # OR WITHIN THE LOCAL FILE "LICENSE" # # -from datetime import date, timedelta import json import re import string from django.test import TestCase from django.urls import reverse -from django.core.management import call_command from django.utils import timezone from django.utils.timezone import timedelta from club.models import Club from core.models import User -from counter.models import Counter, Customer, BillingInfo, Permanency, Selling, Product +from counter.models import BillingInfo, Counter, Customer, Permanency, Product, Selling from sith.settings import SITH_MAIN_CLUB diff --git a/counter/views.py b/counter/views.py index 6bbc819d..fe10d0a1 100644 --- a/counter/views.py +++ b/counter/views.py @@ -14,68 +14,65 @@ # # import json +import re +from datetime import datetime, timedelta +from http import HTTPStatus from urllib.parse import parse_qs +import pytz +from django import forms +from django.conf import settings from django.contrib.auth.decorators import login_required -from django.db.models import F -from django.shortcuts import get_object_or_404 -from django.http import Http404 from django.core.exceptions import PermissionDenied +from django.db import DataError, transaction +from django.db.models import F +from django.forms import CheckboxSelectMultiple +from django.forms.models import modelform_factory +from django.http import Http404, HttpResponse, HttpResponseRedirect, JsonResponse +from django.shortcuts import get_object_or_404 +from django.urls import reverse, reverse_lazy +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from django.views.decorators.http import require_POST -from django.views.generic import ListView, DetailView, RedirectView, TemplateView +from django.views.generic import DetailView, ListView, RedirectView, TemplateView from django.views.generic.base import View from django.views.generic.edit import ( - UpdateView, CreateView, DeleteView, - ProcessFormView, FormMixin, FormView, + ProcessFormView, + UpdateView, ) -from django.forms.models import modelform_factory -from django.forms import CheckboxSelectMultiple -from django.urls import reverse_lazy, reverse -from django.http import HttpResponseRedirect, HttpResponse, JsonResponse -from django.utils import timezone -from django import forms -from django.utils.translation import gettext_lazy as _ -from django.conf import settings -from django.db import DataError, transaction -import json -import re -import pytz -from datetime import timedelta, datetime -from http import HTTPStatus - -from core.utils import get_start_of_semester, get_semester_code -from core.views import CanViewMixin, TabedViewMixin, CanEditMixin -from core.views.forms import LoginForm +from accounting.models import CurrencyField from core.models import User +from core.utils import get_semester_code, get_start_of_semester +from core.views import CanEditMixin, CanViewMixin, TabedViewMixin +from core.views.forms import LoginForm from counter.forms import ( BillingInfoForm, - StudentCardForm, - GetUserForm, - RefillForm, - CounterEditForm, - ProductEditForm, CashSummaryFormBase, + CounterEditForm, EticketForm, + GetUserForm, + ProductEditForm, + RefillForm, + StudentCardForm, ) from counter.models import ( - Counter, - Customer, - StudentCard, - Product, - Selling, - Refilling, - ProductType, + BillingInfo, CashRegisterSummary, CashRegisterSummaryItem, + Counter, + Customer, Eticket, - BillingInfo, + Product, + ProductType, + Refilling, + Selling, + StudentCard, ) -from accounting.models import CurrencyField class CounterAdminMixin(View): @@ -141,9 +138,11 @@ class CounterTabsMixin(TabedViewMixin): "url": reverse_lazy( "counter:details", kwargs={ - "counter_id": self.object.stock_owner.counter.id - if hasattr(self.object, "stock_owner") - else self.object.id + "counter_id": ( + self.object.stock_owner.counter.id + if hasattr(self.object, "stock_owner") + else self.object.id + ) }, ), "slug": "counter", @@ -160,9 +159,11 @@ class CounterTabsMixin(TabedViewMixin): "url": reverse_lazy( "counter:cash_summary", kwargs={ - "counter_id": self.object.stock_owner.counter.id - if hasattr(self.object, "stock_owner") - else self.object.id + "counter_id": ( + self.object.stock_owner.counter.id + if hasattr(self.object, "stock_owner") + else self.object.id + ) }, ), "slug": "cash_summary", @@ -174,9 +175,11 @@ class CounterTabsMixin(TabedViewMixin): "url": reverse_lazy( "counter:last_ops", kwargs={ - "counter_id": self.object.stock_owner.counter.id - if hasattr(self.object, "stock_owner") - else self.object.id + "counter_id": ( + self.object.stock_owner.counter.id + if hasattr(self.object, "stock_owner") + else self.object.id + ) }, ), "slug": "last_ops", @@ -189,9 +192,11 @@ class CounterTabsMixin(TabedViewMixin): "url": reverse_lazy( "stock:take_items", kwargs={ - "stock_id": self.object.stock.id - if hasattr(self.object, "stock") - else self.object.stock_owner.id + "stock_id": ( + self.object.stock.id + if hasattr(self.object, "stock") + else self.object.stock_owner.id + ) }, ), "slug": "take_items_from_stock", @@ -1478,7 +1483,7 @@ class InvoiceCallView(CounterAdminTabsMixin, CounterAdminMixin, TemplateView): end_date = (start_date + timedelta(days=32)).replace( day=1, hour=0, minute=0, microsecond=0 ) - from django.db.models import Sum, Case, When, F + from django.db.models import Case, F, Sum, When kwargs["sum_cb"] = sum( [ @@ -1566,12 +1571,12 @@ class EticketPDFView(CanViewMixin, DetailView): pk_url_kwarg = "selling_id" def get(self, request, *args, **kwargs): - from reportlab.pdfgen import canvas - from reportlab.lib.utils import ImageReader - from reportlab.lib.units import cm - from reportlab.graphics.shapes import Drawing - from reportlab.graphics.barcode.qr import QrCodeWidget from reportlab.graphics import renderPDF + from reportlab.graphics.barcode.qr import QrCodeWidget + from reportlab.graphics.shapes import Drawing + from reportlab.lib.units import cm + from reportlab.lib.utils import ImageReader + from reportlab.pdfgen import canvas if not ( hasattr(self.object, "product") and hasattr(self.object.product, "eticket") diff --git a/doc/conf.py b/doc/conf.py index 2a103e0b..d9f219c9 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -12,6 +12,7 @@ # import os import sys + import django sys.path.insert(0, os.path.abspath("..")) diff --git a/doc/start/devtools.rst b/doc/start/devtools.rst index 9256bfb4..80d56a13 100644 --- a/doc/start/devtools.rst +++ b/doc/start/devtools.rst @@ -1,70 +1,66 @@ Configurer son environnement de développement ============================================= -Le projet n'est en aucun cas lié à un quelconque environnement de développement. Il est possible pour chacun de travailler avec les outils dont il a envie et d'utiliser l'éditeur de code avec lequel il est le plus à l'aise. +Le projet n'est en aucun cas lié à un quelconque environnement de développement. +Il est possible pour chacun de travailler avec les outils dont il a envie et d'utiliser l'éditeur de code avec lequel il est le plus à l'aise. Pour donner une idée, Skia a écrit une énorme partie de projet avec l'éditeur *Vim* sur du GNU/Linux alors que Sli a utilisé *Sublime Text* sur MacOS et que Maréchal travaille avec PyCharm -sur Windows muni de WSL. +sur ~~Windows muni de WSL~~ Arch Linux btw. -Configurer Black pour son éditeur +Configurer Ruff pour son éditeur --------------------------------- .. note:: - Black est inclus dans les dépendances du projet. + Ruff est inclus dans les dépendances du projet. Si vous avez réussi à terminer l'installation, vous n'avez donc pas de configuration supplémentaire à effectuer. -Pour utiliser Black, placez-vous à la racine du projet et lancez la commande suivante : +Pour utiliser Ruff, placez-vous à la racine du projet et lancez la commande suivante : .. code-block:: - black . + ruff format # pour formatter le code + ruff check # pour linter le code -Black va alors faire son travail sur l'ensemble du projet puis vous dire quels documents -ont été reformatés. +Ruff va alors faire son travail sur l'ensemble du projet puis vous dire +si des documents ont été reformatés (si vous avez fait `ruff format`) +ou bien s'il y a des erreurs à réparer (si vous avez faire `ruff check`). -Appeler Black en ligne de commandes avant de pousser votre code sur Github +Appeler Ruff en ligne de commandes avant de pousser votre code sur Github est une technique qui marche très bien. Cependant, vous risquez de souvent l'oublier. -Or, lorsque le code est mal formaté, la pipeline bloque les PR sur les branches protégées. +Or, lorsque le code ne respecte pas les standards de qualité, +la pipeline bloque les PR sur les branches protégées. -Pour éviter de vous faire régulièrement blacked, vous pouvez configurer -votre éditeur pour que Black fasse son travail automatiquement à chaque édition d'un fichier. +Pour éviter de vous faire régulièrement avoir, vous pouvez configurer +votre éditeur pour que Ruff fasse son travail automatiquement à chaque édition d'un fichier. Nous tenterons de vous faire ici un résumé pour deux éditeurs de textes populaires que sont VsCode et Sublime Text. VsCode ~~~~~~ -.. warning:: - - Il faut installer black dans son environement virtuel pour cet éditeur - -Black est directement pris en charge par l'extension pour le Python de VsCode, il suffit de rentrer la configuration suivante : +Installez l'extension Ruff pour VsCode. +Ensuite, ajoutez ceci dans votre configuration : .. sourcecode:: json { - "python.formatting.provider": "black", - "editor.formatOnSave": true + "[python]": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "charliermarsh.ruff" + } } Sublime Text ~~~~~~~~~~~~ -Il est tout d'abord nécessaire d'installer ce plugin : https://packagecontrol.io/packages/sublack. +Vous devez installer ce plugin : https://packagecontrol.io/packages/LSP-ruff. +Suivez ensuite les instructions données dans la description du plugin. -Il suffit ensuite d'ajouter dans les settings du projet (ou directement dans les settings globales) : - -.. sourcecode:: json - - { - "sublack.black_on_save": true - } - -Si vous utilisez le plugin `anaconda `__, pensez à modifier les paramètres du linter pep8 pour éviter de recevoir des warnings dans le formatage de black comme ceci : +Si vous utilisez le plugin `anaconda `__, pensez à modifier les paramètres du linter pep8 pour éviter de recevoir des warnings dans le formatage de ruff comme ceci : .. sourcecode:: json diff --git a/doc/start/install.rst b/doc/start/install.rst index d07e2ac4..db1a9749 100644 --- a/doc/start/install.rst +++ b/doc/start/install.rst @@ -179,7 +179,7 @@ Cette commande génère la documentation à chacune de ses modifications, inutil Les dépendances pour la documentation sont optionnelles. Avant de commencer à travailler sur la doc, il faut donc les installer - avec la commande :code:`poetry install -E docs` + avec la commande :code:`poetry install --with docs` .. sourcecode:: bash diff --git a/eboutic/forms.py b/eboutic/forms.py index c5842700..3189e330 100644 --- a/eboutic/forms.py +++ b/eboutic/forms.py @@ -25,8 +25,8 @@ import json import re import typing - from urllib.parse import unquote + from django.http import HttpRequest from django.utils.translation import gettext as _ from sentry_sdk import capture_message diff --git a/eboutic/migrations/0001_initial.py b/eboutic/migrations/0001_initial.py index b642642f..f698999c 100644 --- a/eboutic/migrations/0001_initial.py +++ b/eboutic/migrations/0001_initial.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -import accounting.models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + +import accounting.models class Migration(migrations.Migration): diff --git a/eboutic/models.py b/eboutic/models.py index 556eb8ab..da048b63 100644 --- a/eboutic/models.py +++ b/eboutic/models.py @@ -14,21 +14,20 @@ # # import hmac -import html import typing from datetime import datetime from typing import List from dict2xml import dict2xml from django.conf import settings -from django.db import models, DataError -from django.db.models import Sum, F +from django.db import DataError, models +from django.db.models import F, Sum from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from accounting.models import CurrencyField -from core.models import Group, User -from counter.models import Counter, Product, Selling, Refilling, BillingInfo, Customer +from core.models import User +from counter.models import BillingInfo, Counter, Customer, Product, Refilling, Selling def get_eboutic_products(user: User) -> List[Product]: diff --git a/eboutic/tests.py b/eboutic/tests.py index af0e5850..3435bfc5 100644 --- a/eboutic/tests.py +++ b/eboutic/tests.py @@ -26,15 +26,14 @@ import base64 import json import urllib -from OpenSSL import crypto from django.conf import settings -from django.core.management import call_command from django.db.models import Max from django.test import TestCase from django.urls import reverse +from OpenSSL import crypto from core.models import User -from counter.models import Product, Counter, Customer, Selling +from counter.models import Counter, Customer, Product, Selling from eboutic.models import Basket @@ -114,9 +113,7 @@ class EbouticTest(TestCase): def test_submit_basket(self): self.client.login(username="subscriber", password="plop") - self.client.cookies[ - "basket_items" - ] = """[ + self.client.cookies["basket_items"] = """[ {"id": 2, "name": "Cotis 2 semestres", "quantity": 1, "unit_price": 28}, {"id": 4, "name": "Barbar", "quantity": 3, "unit_price": 1.7} ]""" @@ -150,9 +147,7 @@ class EbouticTest(TestCase): def test_submit_invalid_basket(self): self.client.login(username="subscriber", password="plop") max_id = Product.objects.aggregate(res=Max("id"))["res"] - self.client.cookies[ - "basket_items" - ] = f"""[ + self.client.cookies["basket_items"] = f"""[ {{"id": {max_id + 1}, "name": "", "quantity": 1, "unit_price": 28}} ]""" response = self.client.get(reverse("eboutic:command")) @@ -168,9 +163,7 @@ class EbouticTest(TestCase): def test_submit_basket_illegal_quantity(self): self.client.login(username="subscriber", password="plop") - self.client.cookies[ - "basket_items" - ] = """[ + self.client.cookies["basket_items"] = """[ {"id": 4, "name": "Barbar", "quantity": -1, "unit_price": 1.7} ]""" response = self.client.get(reverse("eboutic:command")) @@ -182,9 +175,7 @@ class EbouticTest(TestCase): reverse("core:user_profile", kwargs={"user_id": self.old_subscriber.id}) ) self.assertTrue("Non cotisant" in str(response.content)) - self.client.cookies[ - "basket_items" - ] = """[ + self.client.cookies["basket_items"] = """[ {"id": 2, "name": "Cotis 2 semestres", "quantity": 1, "unit_price": 28} ]""" response = self.client.get(reverse("eboutic:command")) diff --git a/eboutic/tests/test.py b/eboutic/tests/test.py index 2a4e6cfb..359db7ff 100755 --- a/eboutic/tests/test.py +++ b/eboutic/tests/test.py @@ -7,6 +7,7 @@ # import base64 + from OpenSSL import crypto with open("./private_key.pem") as f: diff --git a/eboutic/urls.py b/eboutic/urls.py index a1bd6ecd..22602aeb 100644 --- a/eboutic/urls.py +++ b/eboutic/urls.py @@ -25,8 +25,8 @@ from django.urls import path, register_converter -from eboutic.views import * from eboutic.converters import PaymentResultConverter +from eboutic.views import * register_converter(PaymentResultConverter, "res") diff --git a/eboutic/views.py b/eboutic/views.py index 885edf43..c240d64d 100644 --- a/eboutic/views.py +++ b/eboutic/views.py @@ -16,23 +16,23 @@ import base64 import json -import sentry_sdk - from datetime import datetime from urllib.parse import unquote -from OpenSSL import crypto + +import sentry_sdk from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.exceptions import SuspiciousOperation -from django.db import transaction, DatabaseError -from django.http import HttpResponse, HttpRequest -from django.shortcuts import render, redirect +from django.db import DatabaseError, transaction +from django.http import HttpRequest, HttpResponse +from django.shortcuts import redirect, render from django.utils.decorators import method_decorator from django.views.decorators.http import require_GET, require_POST from django.views.generic import TemplateView, View +from OpenSSL import crypto from counter.forms import BillingInfoForm -from counter.models import Customer, Counter, Product +from counter.models import Counter, Customer, Product from eboutic.forms import BasketForm from eboutic.models import Basket, Invoice, InvoiceItem, get_eboutic_products diff --git a/election/admin.py b/election/admin.py index 3cd3ce37..fadc9a52 100644 --- a/election/admin.py +++ b/election/admin.py @@ -1,7 +1,7 @@ from ajax_select import make_ajax_form from django.contrib import admin -from election.models import Election, Role, ElectionList, Candidature +from election.models import Candidature, Election, ElectionList, Role @admin.register(Election) diff --git a/election/migrations/0001_initial.py b/election/migrations/0001_initial.py index d3c4c449..04deb469 100644 --- a/election/migrations/0001_initial.py +++ b/election/migrations/0001_initial.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/election/models.py b/election/models.py index f100a1d6..3bcf761f 100644 --- a/election/models.py +++ b/election/models.py @@ -1,9 +1,9 @@ from django.db import models -from ordered_model.models import OrderedModel -from django.utils.translation import gettext_lazy as _ from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from ordered_model.models import OrderedModel -from core.models import User, Group +from core.models import Group, User class Election(models.Model): diff --git a/election/tests.py b/election/tests.py index 03b46481..3a3de97a 100644 --- a/election/tests.py +++ b/election/tests.py @@ -1,9 +1,8 @@ +from django.conf import settings from django.test import TestCase from django.urls import reverse -from django.core.management import call_command -from django.conf import settings -from core.models import User, Group +from core.models import Group, User from election.models import Election diff --git a/election/views.py b/election/views.py index a223c78c..71be8bfe 100644 --- a/election/views.py +++ b/election/views.py @@ -1,24 +1,19 @@ -from django.shortcuts import get_object_or_404 -from django.views.generic import ListView, DetailView -from django.views.generic.edit import UpdateView, CreateView -from django.views.generic.edit import DeleteView, FormView -from django.urls import reverse_lazy, reverse -from django.utils.translation import gettext_lazy as _ +from ajax_select import make_ajax_field +from ajax_select.fields import AutoCompleteSelectField +from django import forms from django.core.exceptions import PermissionDenied from django.db import transaction -from django.shortcuts import redirect -from django import forms +from django.db.models.query import QuerySet +from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse, reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView +from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView from core.models import User -from core.views import CanViewMixin, CanEditMixin, CanCreateMixin -from django.db.models.query import QuerySet -from core.views.forms import SelectDateTime, MarkdownInput -from election.models import Election, Role, Candidature, ElectionList, Vote -from core.views.forms import TzAwareDateTimeField - -from ajax_select.fields import AutoCompleteSelectField -from ajax_select import make_ajax_field - +from core.views import CanCreateMixin, CanEditMixin, CanViewMixin +from core.views.forms import MarkdownInput, TzAwareDateTimeField +from election.models import Candidature, Election, ElectionList, Role, Vote # Custom form field diff --git a/forum/admin.py b/forum/admin.py index 6d0c088a..eff7d401 100644 --- a/forum/admin.py +++ b/forum/admin.py @@ -17,7 +17,6 @@ from django.contrib import admin from haystack.admin import SearchModelAdmin - from forum.models import * diff --git a/forum/migrations/0001_initial.py b/forum/migrations/0001_initial.py index 6c06b0a6..4ad137d6 100644 --- a/forum/migrations/0001_initial.py +++ b/forum/migrations/0001_initial.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import datetime + +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings from django.db import migrations, models from django.utils.timezone import utc -from django.conf import settings -import django.utils.timezone -import datetime -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/forum/migrations/0004_auto_20170531_1949.py b/forum/migrations/0004_auto_20170531_1949.py index 152bdaea..ef466a9b 100644 --- a/forum/migrations/0004_auto_20170531_1949.py +++ b/forum/migrations/0004_auto_20170531_1949.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/forum/migrations/0005_forumtopic_subscribed_users.py b/forum/migrations/0005_forumtopic_subscribed_users.py index b1f6d629..b977aadf 100644 --- a/forum/migrations/0005_forumtopic_subscribed_users.py +++ b/forum/migrations/0005_forumtopic_subscribed_users.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/forum/migrations/0006_auto_20180426_2013.py b/forum/migrations/0006_auto_20180426_2013.py index 30248dec..974b9b8e 100644 --- a/forum/migrations/0006_auto_20180426_2013.py +++ b/forum/migrations/0006_auto_20180426_2013.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.db import migrations, models + import forum.models diff --git a/forum/models.py b/forum/models.py index 3894caa7..a7d77c4d 100644 --- a/forum/models.py +++ b/forum/models.py @@ -22,20 +22,20 @@ # # -from django.db import models +from datetime import datetime +from itertools import chain + +import pytz from django.conf import settings -from django.utils.translation import gettext_lazy as _ from django.core.exceptions import ValidationError +from django.db import models from django.urls import reverse from django.utils import timezone from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ -from datetime import datetime -from itertools import chain -import pytz - -from core.models import User, Group from club.models import Club +from core.models import Group, User class Forum(models.Model): diff --git a/forum/tests.py b/forum/tests.py index 46a200c2..d888e761 100644 --- a/forum/tests.py +++ b/forum/tests.py @@ -14,6 +14,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/forum/views.py b/forum/views.py index 9b75794b..74e6bff4 100644 --- a/forum/views.py +++ b/forum/views.py @@ -23,31 +23,30 @@ # # -from django.shortcuts import get_object_or_404 -from django.views.generic import ListView, DetailView, RedirectView -from django.views.generic.edit import UpdateView, CreateView, DeleteView -from django.views.generic.detail import SingleObjectMixin -from django.utils.translation import gettext_lazy as _ -from django.urls import reverse_lazy -from django.utils import timezone, html -from django.conf import settings -from django import forms -from django.core.exceptions import PermissionDenied -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger - from ajax_select import make_ajax_field +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator +from django.shortcuts import get_object_or_404 +from django.urls import reverse_lazy +from django.utils import html, timezone +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView, RedirectView +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import CreateView, DeleteView, UpdateView +from haystack.query import RelatedSearchQuerySet from core.views import ( - CanViewMixin, + CanCreateMixin, CanEditMixin, CanEditPropMixin, - CanCreateMixin, + CanViewMixin, UserIsLoggedMixin, can_view, ) from core.views.forms import MarkdownInput -from forum.models import Forum, ForumMessage, ForumTopic, ForumMessageMeta -from haystack.query import RelatedSearchQuerySet +from forum.models import Forum, ForumMessage, ForumMessageMeta, ForumTopic class ForumSearchView(ListView): diff --git a/galaxy/management/commands/generate_galaxy_test_data.py b/galaxy/management/commands/generate_galaxy_test_data.py index f6442487..191198f7 100644 --- a/galaxy/management/commands/generate_galaxy_test_data.py +++ b/galaxy/management/commands/generate_galaxy_test_data.py @@ -21,7 +21,9 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # +import logging import warnings +from datetime import timedelta from typing import Final, Optional from django.conf import settings @@ -29,15 +31,10 @@ from django.core.files.base import ContentFile from django.core.management.base import BaseCommand from django.utils import timezone -from datetime import timedelta - -import logging - from club.models import Club, Membership -from core.models import User, Group, Page, SithFile +from core.models import Group, Page, SithFile, User +from sas.models import Album, PeoplePictureRelation, Picture from subscription.models import Subscription -from sas.models import Album, Picture, PeoplePictureRelation - RED_PIXEL_PNG: Final[bytes] = ( b"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52" diff --git a/galaxy/management/commands/rule_galaxy.py b/galaxy/management/commands/rule_galaxy.py index 55cb9ae9..1743fadc 100644 --- a/galaxy/management/commands/rule_galaxy.py +++ b/galaxy/management/commands/rule_galaxy.py @@ -21,6 +21,7 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # +import logging import warnings from django.core.management.base import BaseCommand @@ -28,8 +29,6 @@ from django.db import connection from galaxy.models import Galaxy -import logging - class Command(BaseCommand): help = ( diff --git a/galaxy/migrations/0001_initial.py b/galaxy/migrations/0001_initial.py index ab9a6a06..7c8e8521 100644 --- a/galaxy/migrations/0001_initial.py +++ b/galaxy/migrations/0001_initial.py @@ -1,8 +1,8 @@ # Generated by Django 3.2.16 on 2023-03-02 10:07 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/galaxy/migrations/0002_auto_20230412_1130.py b/galaxy/migrations/0002_auto_20230412_1130.py index be01af99..00a69d00 100644 --- a/galaxy/migrations/0002_auto_20230412_1130.py +++ b/galaxy/migrations/0002_auto_20230412_1130.py @@ -1,8 +1,8 @@ # Generated by Django 3.2.16 on 2023-04-12 09:30 +import django.db.models.deletion from django.conf import settings from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): diff --git a/galaxy/models.py b/galaxy/models.py index 744cca79..cca7397d 100644 --- a/galaxy/models.py +++ b/galaxy/models.py @@ -24,20 +24,19 @@ from __future__ import annotations -import math import logging +import math import time - -from typing import List, TypedDict, NamedTuple, Union, Optional +from typing import List, NamedTuple, Optional, TypedDict, Union from django.db import models -from django.db.models import Q, Case, F, Value, When, Count +from django.db.models import Case, Count, F, Q, Value, When from django.db.models.functions import Concat from django.utils import timezone from django.utils.translation import gettext_lazy as _ -from core.models import User from club.models import Club +from core.models import User from sas.models import Picture diff --git a/galaxy/tests.py b/galaxy/tests.py index 70314574..2a523af3 100644 --- a/galaxy/tests.py +++ b/galaxy/tests.py @@ -23,7 +23,6 @@ # import json - from pathlib import Path from django.core.management import call_command diff --git a/galaxy/views.py b/galaxy/views.py index 3dda003e..3e0b33da 100644 --- a/galaxy/views.py +++ b/galaxy/views.py @@ -22,18 +22,18 @@ # # -from django.views.generic import DetailView, View -from django.http import JsonResponse, Http404 -from django.db.models import Q, Case, F, When, Value +from django.db.models import Case, F, Q, Value, When from django.db.models.functions import Concat +from django.http import Http404, JsonResponse from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, View +from core.models import User from core.views import ( CanViewMixin, FormerSubscriberMixin, + UserTabsMixin, ) -from core.models import User -from core.views import UserTabsMixin from galaxy.models import Galaxy, GalaxyLane diff --git a/launderette/migrations/0001_initial.py b/launderette/migrations/0001_initial.py index 79f011a7..f1548cd2 100644 --- a/launderette/migrations/0001_initial.py +++ b/launderette/migrations/0001_initial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/launderette/models.py b/launderette/models.py index 3ca12b2d..c2f344bb 100644 --- a/launderette/models.py +++ b/launderette/models.py @@ -14,14 +14,14 @@ # # -from django.db import models, DataError -from django.utils.translation import gettext_lazy as _ from django.conf import settings +from django.db import DataError, models from django.urls import reverse +from django.utils.translation import gettext_lazy as _ -from counter.models import Counter -from core.models import User from club.models import Club +from core.models import User +from counter.models import Counter # Create your models here. diff --git a/launderette/tests.py b/launderette/tests.py index 46a200c2..d888e761 100644 --- a/launderette/tests.py +++ b/launderette/tests.py @@ -14,6 +14,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/launderette/views.py b/launderette/views.py index 716b41f4..c0b16eed 100644 --- a/launderette/views.py +++ b/launderette/views.py @@ -14,27 +14,26 @@ # # -from datetime import datetime, timedelta from collections import OrderedDict +from datetime import datetime, timedelta + import pytz - -from django.views.generic import ListView, DetailView, TemplateView -from django.views.generic.edit import UpdateView, CreateView, DeleteView, BaseFormView -from django.utils.translation import gettext as _ -from django.utils import dateparse, timezone -from django.urls import reverse_lazy -from django.conf import settings -from django.db import transaction, DataError from django import forms +from django.conf import settings +from django.db import DataError, transaction from django.template import defaultfilters +from django.urls import reverse_lazy +from django.utils import dateparse, timezone +from django.utils.translation import gettext as _ +from django.views.generic import DetailView, ListView, TemplateView +from django.views.generic.edit import BaseFormView, CreateView, DeleteView, UpdateView -from core.models import Page, User from club.models import Club -from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin -from launderette.models import Launderette, Token, Machine, Slot -from counter.models import Counter, Customer, Selling +from core.models import Page, User +from core.views import CanCreateMixin, CanEditMixin, CanEditPropMixin, CanViewMixin from counter.forms import GetUserForm - +from counter.models import Counter, Customer, Selling +from launderette.models import Launderette, Machine, Slot, Token # For users diff --git a/matmat/admin.py b/matmat/admin.py index 8c38f3f3..846f6b40 100644 --- a/matmat/admin.py +++ b/matmat/admin.py @@ -1,3 +1 @@ -from django.contrib import admin - # Register your models here. diff --git a/matmat/models.py b/matmat/models.py index 71a83623..6b202199 100644 --- a/matmat/models.py +++ b/matmat/models.py @@ -1,3 +1 @@ -from django.db import models - # Create your models here. diff --git a/matmat/tests.py b/matmat/tests.py index 7ce503c2..a39b155a 100644 --- a/matmat/tests.py +++ b/matmat/tests.py @@ -1,3 +1 @@ -from django.test import TestCase - # Create your tests here. diff --git a/matmat/views.py b/matmat/views.py index 10b2d4f5..eb769c62 100644 --- a/matmat/views.py +++ b/matmat/views.py @@ -24,19 +24,18 @@ from ast import literal_eval from enum import Enum -from django.views.generic import ListView, View -from django.views.generic.edit import FormView -from django.utils.translation import gettext_lazy as _ -from django.views.generic.detail import SingleObjectMixin +from django import forms from django.http.response import HttpResponseRedirect from django.urls import reverse -from django import forms +from django.utils.translation import gettext_lazy as _ +from django.views.generic import ListView, View +from django.views.generic.detail import SingleObjectMixin +from django.views.generic.edit import FormView +from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget from core.models import User -from core.views import FormerSubscriberMixin +from core.views import FormerSubscriberMixin, search_user from core.views.forms import SelectDate -from core.views import search_user -from phonenumber_field.widgets import PhoneNumberInternationalFallbackWidget # Enum to select search type diff --git a/pedagogy/forms.py b/pedagogy/forms.py index 6a3d29ce..28810e64 100644 --- a/pedagogy/forms.py +++ b/pedagogy/forms.py @@ -24,12 +24,9 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from django.forms.widgets import Widget -from django.templatetags.static import static -from core.views.forms import MarkdownInput from core.models import User - +from core.views.forms import MarkdownInput from pedagogy.models import UV, UVComment, UVCommentReport diff --git a/pedagogy/migrations/0001_initial.py b/pedagogy/migrations/0001_initial.py index e4285277..782e65c4 100644 --- a/pedagogy/migrations/0001_initial.py +++ b/pedagogy/migrations/0001_initial.py @@ -2,10 +2,10 @@ # Generated by Django 1.11.20 on 2019-07-05 14:32 from __future__ import unicode_literals -from django.conf import settings import django.core.validators -from django.db import migrations, models import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/pedagogy/models.py b/pedagogy/models.py index 2278dda6..0de5c230 100644 --- a/pedagogy/models.py +++ b/pedagogy/models.py @@ -22,14 +22,13 @@ # # -from django.db import models -from django.utils.translation import gettext_lazy as _ -from django.utils import timezone -from django.core import validators from django.conf import settings -from django.utils.functional import cached_property +from django.core import validators +from django.db import models from django.urls import reverse - +from django.utils import timezone +from django.utils.functional import cached_property +from django.utils.translation import gettext_lazy as _ from rest_framework import serializers from core.models import User diff --git a/pedagogy/search_indexes.py b/pedagogy/search_indexes.py index 3ea75343..c6bc74af 100644 --- a/pedagogy/search_indexes.py +++ b/pedagogy/search_indexes.py @@ -23,7 +23,6 @@ # from django.db import models - from haystack import indexes, signals from core.search_indexes import BigCharFieldIndex diff --git a/pedagogy/tests.py b/pedagogy/tests.py index baee59bf..c52ee2ae 100644 --- a/pedagogy/tests.py +++ b/pedagogy/tests.py @@ -23,13 +23,12 @@ # from django.conf import settings +from django.core.management import call_command from django.test import TestCase from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from django.core.management import call_command - -from core.models import User, Notification +from core.models import Notification, User from pedagogy.models import UV, UVComment, UVCommentReport diff --git a/pedagogy/views.py b/pedagogy/views.py index 13151c60..89187ca5 100644 --- a/pedagogy/views.py +++ b/pedagogy/views.py @@ -22,38 +22,35 @@ # # +from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist, PermissionDenied +from django.http import HttpResponse +from django.shortcuts import get_object_or_404 +from django.urls import reverse, reverse_lazy +from django.utils import html from django.views.generic import ( CreateView, DeleteView, - UpdateView, - ListView, FormView, + ListView, + UpdateView, View, ) -from django.utils import html -from django.http import HttpResponse -from django.core.exceptions import PermissionDenied, ObjectDoesNotExist -from django.urls import reverse_lazy, reverse -from django.shortcuts import get_object_or_404 -from django.conf import settings - from haystack.query import SearchQuerySet from rest_framework.renderers import JSONRenderer +from core.models import Notification, RealGroup from core.views import ( - DetailFormView, CanCreateMixin, - CanEditMixin, - CanViewMixin, CanEditPropMixin, + CanViewMixin, + DetailFormView, ) -from core.models import RealGroup, Notification - from pedagogy.forms import ( - UVForm, UVCommentForm, - UVCommentReportForm, UVCommentModerationForm, + UVCommentReportForm, + UVForm, ) from pedagogy.models import UV, UVComment, UVCommentReport, UVSerializer diff --git a/poetry.lock b/poetry.lock index 00ba5bb5..f43c9663 100644 --- a/poetry.lock +++ b/poetry.lock @@ -64,52 +64,6 @@ files = [ {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] -[[package]] -name = "black" -version = "23.12.1" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" -files = [ - {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, - {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, - {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, - {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, - {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, - {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, - {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, - {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, - {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, - {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, - {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, - {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, - {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, - {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, - {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, -] - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "certifi" version = "2024.6.2" @@ -295,20 +249,6 @@ files = [ {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "colorama" version = "0.4.6" @@ -322,67 +262,67 @@ files = [ [[package]] name = "coverage" -version = "5.5" +version = "7.5.4" description = "Code coverage measurement for Python" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +optional = false +python-versions = ">=3.8" files = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, + {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, + {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, + {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, + {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, + {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, + {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, + {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, + {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, + {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, + {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, + {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, + {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, + {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, + {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, + {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, + {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, + {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, + {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, + {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, + {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, + {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, + {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, + {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, + {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, + {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, + {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, + {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, ] [package.extras] -toml = ["toml"] +toml = ["tomli"] [[package]] name = "cryptography" @@ -868,17 +808,6 @@ files = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - [[package]] name = "packaging" version = "24.1" @@ -905,17 +834,6 @@ files = [ qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["docopt", "pytest"] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - [[package]] name = "pexpect" version = "4.9.0" @@ -1031,22 +949,6 @@ files = [ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -[[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, -] - -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] - [[package]] name = "prompt-toolkit" version = "3.0.47" @@ -1272,6 +1174,32 @@ urllib3 = ">=1.21.1,<3" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +[[package]] +name = "ruff" +version = "0.4.10" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.4.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:5c2c4d0859305ac5a16310eec40e4e9a9dec5dcdfbe92697acd99624e8638dac"}, + {file = "ruff-0.4.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a79489607d1495685cdd911a323a35871abfb7a95d4f98fc6f85e799227ac46e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1dd1681dfa90a41b8376a61af05cc4dc5ff32c8f14f5fe20dba9ff5deb80cd6"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c75c53bb79d71310dc79fb69eb4902fba804a81f374bc86a9b117a8d077a1784"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18238c80ee3d9100d3535d8eb15a59c4a0753b45cc55f8bf38f38d6a597b9739"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d8f71885bce242da344989cae08e263de29752f094233f932d4f5cfb4ef36a81"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:330421543bd3222cdfec481e8ff3460e8702ed1e58b494cf9d9e4bf90db52b9d"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e9b6fb3a37b772628415b00c4fc892f97954275394ed611056a4b8a2631365e"}, + {file = "ruff-0.4.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f54c481b39a762d48f64d97351048e842861c6662d63ec599f67d515cb417f6"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:67fe086b433b965c22de0b4259ddfe6fa541c95bf418499bedb9ad5fb8d1c631"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:acfaaab59543382085f9eb51f8e87bac26bf96b164839955f244d07125a982ef"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3cea07079962b2941244191569cf3a05541477286f5cafea638cd3aa94b56815"}, + {file = "ruff-0.4.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:338a64ef0748f8c3a80d7f05785930f7965d71ca260904a9321d13be24b79695"}, + {file = "ruff-0.4.10-py3-none-win32.whl", hash = "sha256:ffe3cd2f89cb54561c62e5fa20e8f182c0a444934bf430515a4b422f1ab7b7ca"}, + {file = "ruff-0.4.10-py3-none-win_amd64.whl", hash = "sha256:67f67cef43c55ffc8cc59e8e0b97e9e60b4837c8f21e8ab5ffd5d66e196e25f7"}, + {file = "ruff-0.4.10-py3-none-win_arm64.whl", hash = "sha256:dd1fcee327c20addac7916ca4e2653fbbf2e8388d8a6477ce5b4e986b68ae6c0"}, + {file = "ruff-0.4.10.tar.gz", hash = "sha256:3aa4f2bc388a30d346c56524f7cacca85945ba124945fe489952aadb6b5cd804"}, +] + [[package]] name = "sentry-sdk" version = "1.45.0" @@ -1394,7 +1322,7 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"] name = "sphinx-copybutton" version = "0.4.0" description = "Add a copy button to each of your code cells." -optional = true +optional = false python-versions = ">=3.6" files = [ {file = "sphinx-copybutton-0.4.0.tar.gz", hash = "sha256:8daed13a87afd5013c3a9af3575cc4d5bec052075ccd3db243f895c07a689386"}, @@ -1412,7 +1340,7 @@ rtd = ["ipython", "sphinx", "sphinx-book-theme"] name = "sphinx-rtd-theme" version = "1.3.0" description = "Read the Docs theme for Sphinx" -optional = true +optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ {file = "sphinx_rtd_theme-1.3.0-py2.py3-none-any.whl", hash = "sha256:46ddef89cc2416a81ecfbeaceab1881948c014b1b6e4450b815311a89fb977b0"}, @@ -1479,7 +1407,7 @@ test = ["html5lib", "pytest"] name = "sphinxcontrib-jquery" version = "4.1" description = "Extension to include jQuery on newer Sphinx releases" -optional = true +optional = false python-versions = ">=2.7" files = [ {file = "sphinxcontrib-jquery-4.1.tar.gz", hash = "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a"}, @@ -1630,11 +1558,7 @@ django = ">=3.2" django-haystack = ">=2.8.0" filelock = ">=3.4" -[extras] -docs = ["Sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] -testing = ["coverage"] - [metadata] lock-version = "2.0" python-versions = "^3.10,<3.12" -content-hash = "1b87ea58b2796016b7f16421fd0d4276d88fc6be217e3e5934f3399b834af1f6" +content-hash = "78f859d93ec1f207dbdebd5b608abfac44f87bb254a37ebeafaaf1823f605a71" diff --git a/pyproject.toml b/pyproject.toml index a27426eb..e9dfe6d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,25 +48,30 @@ dict2xml = "^1.7.3" Sphinx = "^5" # Needed for building xapian tomli = "^2.0.1" -# Extra optional dependencies -coverage = {version = "^5.5", optional = true} +[tool.poetry.group.dev.dependencies] +freezegun = "^1.2.2" # used to test time-dependent code +django-debug-toolbar = "^4.0.0" +ipython = "^7.28.0" +ruff = "^0.4.10" -# Docs extra dependencies -sphinx-rtd-theme = {version = "^1.0.0", optional = true} -sphinx-copybutton = {version = "^0.4.0", optional = true} +[tool.poetry.group.tests.dependencies] +coverage = "^7.5.4" + +[tool.poetry.group.tests] +optional = true + +[tool.poetry.group.docs.dependencies] +sphinx-rtd-theme = "^1.0.0" +sphinx-copybutton = "^0.4.0" + +[tool.poetry.group.docs] +optional = true [tool.xapian] version = "1.4.25" -[tool.poetry.extras] -testing = ["coverage"] -docs = ["Sphinx", "sphinx-rtd-theme", "sphinx-copybutton"] - -[tool.poetry.dev-dependencies] -freezegun = "^1.2.2" # used to test time-dependent code -django-debug-toolbar = "^4.0.0" -ipython = "^7.28.0" -black = "^23.3.0" +[tool.ruff.lint] +select = ["I", "F401"] [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/rootplace/admin.py b/rootplace/admin.py index 362a5c4f..5531f2a2 100644 --- a/rootplace/admin.py +++ b/rootplace/admin.py @@ -14,6 +14,4 @@ # # -from django.contrib import admin - # Register your models here. diff --git a/rootplace/models.py b/rootplace/models.py index 5672eba4..084dfa73 100644 --- a/rootplace/models.py +++ b/rootplace/models.py @@ -14,6 +14,4 @@ # # -from django.db import models - # Create your models here. diff --git a/rootplace/tests.py b/rootplace/tests.py index f1bb174f..80119edf 100644 --- a/rootplace/tests.py +++ b/rootplace/tests.py @@ -15,14 +15,12 @@ # from datetime import date, timedelta -from django.core.management import call_command from django.test import TestCase from django.urls import reverse -from django.utils.timezone import localtime, now from club.models import Club -from core.models import User, RealGroup -from counter.models import Customer, Product, Selling, Counter, Refilling +from core.models import RealGroup, User +from counter.models import Counter, Customer, Product, Refilling, Selling from subscription.models import Subscription diff --git a/rootplace/views.py b/rootplace/views.py index fbb04e79..7a045b73 100644 --- a/rootplace/views.py +++ b/rootplace/views.py @@ -32,7 +32,7 @@ from django.utils.translation import gettext as _ from django.views.generic import ListView from django.views.generic.edit import FormView -from core.models import User, OperationLog, SithFile +from core.models import OperationLog, SithFile, User from core.views import CanEditPropMixin from counter.models import Customer from forum.models import ForumMessageMeta diff --git a/sas/admin.py b/sas/admin.py index d1001ef8..3f6c6f42 100644 --- a/sas/admin.py +++ b/sas/admin.py @@ -18,7 +18,6 @@ from django.contrib import admin from sas.models import * - admin.site.register(Album) # admin.site.register(Picture) admin.site.register(PeoplePictureRelation) diff --git a/sas/migrations/0001_initial.py b/sas/migrations/0001_initial.py index 41ed4dc9..7ef55737 100644 --- a/sas/migrations/0001_initial.py +++ b/sas/migrations/0001_initial.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models +from django.db import migrations class Migration(migrations.Migration): diff --git a/sas/migrations/0002_auto_20161119_1241.py b/sas/migrations/0002_auto_20161119_1241.py index 21f44323..15ba12ad 100644 --- a/sas/migrations/0002_auto_20161119_1241.py +++ b/sas/migrations/0002_auto_20161119_1241.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/sas/models.py b/sas/models.py index e9fe4f97..3342facf 100644 --- a/sas/models.py +++ b/sas/models.py @@ -14,19 +14,19 @@ # # +import os +from io import BytesIO + +from django.conf import settings +from django.core.cache import cache from django.db import models from django.urls import reverse -from django.core.cache import cache -from django.conf import settings -from django.utils.translation import gettext_lazy as _ from django.utils import timezone - +from django.utils.translation import gettext_lazy as _ from PIL import Image -from io import BytesIO -import os from core.models import SithFile, User -from core.utils import resize_image, exif_auto_rotate +from core.utils import exif_auto_rotate, resize_image class SASPictureManager(models.Manager): diff --git a/sas/tests.py b/sas/tests.py index 46a200c2..d888e761 100644 --- a/sas/tests.py +++ b/sas/tests.py @@ -14,6 +14,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/sas/views.py b/sas/views.py index 052f7a4e..c2821bac 100644 --- a/sas/views.py +++ b/sas/views.py @@ -14,26 +14,24 @@ # # -from django.shortcuts import redirect -from django.http import HttpResponse, Http404 -from django.urls import reverse_lazy, reverse -from core.views.forms import SelectDate -from django.views.generic import DetailView, TemplateView -from django.views.generic.edit import UpdateView, FormMixin, FormView -from django.utils.translation import gettext_lazy as _ -from django.conf import settings -from django import forms -from django.core.exceptions import PermissionDenied -from django.core.paginator import Paginator, InvalidPage - from ajax_select import make_ajax_field from ajax_select.fields import AutoCompleteSelectMultipleField +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.core.paginator import InvalidPage, Paginator +from django.http import Http404, HttpResponse +from django.shortcuts import redirect +from django.urls import reverse, reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, TemplateView +from django.views.generic.edit import FormMixin, FormView, UpdateView -from core.views import CanViewMixin, CanEditMixin -from core.views.files import send_file, FileView, MultipleImageField -from core.models import SithFile, User, Notification, RealGroup - -from sas.models import Picture, Album, PeoplePictureRelation +from core.models import Notification, SithFile, User +from core.views import CanEditMixin, CanViewMixin +from core.views.files import FileView, MultipleImageField, send_file +from core.views.forms import SelectDate +from sas.models import Album, PeoplePictureRelation, Picture class SASForm(forms.Form): diff --git a/sith/settings.py b/sith/settings.py index 5ed279af..df2b4ced 100644 --- a/sith/settings.py +++ b/sith/settings.py @@ -567,7 +567,7 @@ SITH_SUBSCRIPTIONS = { "name": _("One year for free(CA offer)"), "price": 0, "duration": 2, - } + }, # To be completed.... } diff --git a/sith/urls.py b/sith/urls.py index 6a098b5e..106c2851 100644 --- a/sith/urls.py +++ b/sith/urls.py @@ -29,14 +29,13 @@ Including another URLconf 1. Add an import: from blog import urls as blog_urls 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) """ -from django.urls import include, path -from django.contrib import admin + +from ajax_select import urls as ajax_select_urls from django.conf import settings from django.conf.urls.static import static +from django.contrib import admin +from django.urls import include, path from django.views.i18n import JavaScriptCatalog -from ajax_select import urls as ajax_select_urls - -import core.urls js_info_dict = {"packages": ("sith",)} diff --git a/stock/admin.py b/stock/admin.py index 46567a3b..28985c8c 100644 --- a/stock/admin.py +++ b/stock/admin.py @@ -25,7 +25,7 @@ from django.contrib import admin -from stock.models import Stock, StockItem, ShoppingList, ShoppingListItem +from stock.models import ShoppingList, ShoppingListItem, Stock, StockItem # Register your models here. admin.site.register(Stock) diff --git a/stock/migrations/0001_initial.py b/stock/migrations/0001_initial.py index 43b658ff..e203981a 100644 --- a/stock/migrations/0001_initial.py +++ b/stock/migrations/0001_initial.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/stock/models.py b/stock/models.py index 6c9c1ae7..f93a1544 100644 --- a/stock/models.py +++ b/stock/models.py @@ -23,11 +23,10 @@ # # -from django.db import models -from django.utils.translation import gettext_lazy as _ -from django.urls import reverse from django.conf import settings - +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from counter.models import Counter, ProductType diff --git a/stock/tests.py b/stock/tests.py index ad602a5c..884e1b09 100644 --- a/stock/tests.py +++ b/stock/tests.py @@ -23,6 +23,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/stock/views.py b/stock/views.py index 6b4776aa..72a9ab56 100644 --- a/stock/views.py +++ b/stock/views.py @@ -24,36 +24,21 @@ # from collections import OrderedDict -from datetime import datetime, timedelta -from django.utils import timezone -from django.shortcuts import render, get_object_or_404 -from django.views.generic import ListView, DetailView, RedirectView, TemplateView -from django.views.generic.edit import ( - UpdateView, - CreateView, - DeleteView, - ProcessFormView, - FormMixin, - BaseFormView, -) -from django.utils.translation import gettext_lazy as _ from django import forms -from django.http import HttpResponseRedirect, HttpResponse +from django.db import transaction from django.forms.models import modelform_factory -from django.urls import reverse_lazy, reverse -from django.db import transaction, DataError +from django.http import HttpResponseRedirect +from django.urls import reverse, reverse_lazy +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, ListView +from django.views.generic.edit import BaseFormView, CreateView, DeleteView, UpdateView -from core.views import ( - CanViewMixin, - CanEditMixin, - CanEditPropMixin, - CanCreateMixin, - TabedViewMixin, -) +from core.views import CanCreateMixin, CanEditMixin, CanEditPropMixin, CanViewMixin +from counter.models import ProductType from counter.views import CounterAdminTabsMixin, CounterTabsMixin -from counter.models import Counter, ProductType -from stock.models import Stock, StockItem, ShoppingList, ShoppingListItem +from stock.models import ShoppingList, ShoppingListItem, Stock, StockItem class StockItemList(CounterAdminTabsMixin, CanCreateMixin, ListView): diff --git a/subscription/migrations/0001_initial.py b/subscription/migrations/0001_initial.py index 3ca942f0..932fafaf 100644 --- a/subscription/migrations/0001_initial.py +++ b/subscription/migrations/0001_initial.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.contrib.auth.models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/subscription/models.py b/subscription/models.py index f1c2b2d5..5e47ab75 100644 --- a/subscription/models.py +++ b/subscription/models.py @@ -14,17 +14,16 @@ # # +import math from datetime import date, timedelta -from django.db import models -from django.utils.translation import gettext_lazy as _ -from django.conf import settings -from django.core.exceptions import ValidationError -from django.urls import reverse -from django.contrib.auth.forms import PasswordResetForm from dateutil.relativedelta import relativedelta - -import math +from django.conf import settings +from django.contrib.auth.forms import PasswordResetForm +from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ from core.models import User from core.utils import get_start_of_semester diff --git a/subscription/tests.py b/subscription/tests.py index 4e8ec5a1..1b9924e8 100644 --- a/subscription/tests.py +++ b/subscription/tests.py @@ -16,12 +16,11 @@ from datetime import date from unittest import mock -from django.test import TestCase -from subscription.models import Subscription -from core.models import User from django.conf import settings -from datetime import datetime -from django.core.management import call_command +from django.test import TestCase + +from core.models import User +from subscription.models import Subscription class FakeDate(date): diff --git a/subscription/views.py b/subscription/views.py index bd10ac2c..ccffd58f 100644 --- a/subscription/views.py +++ b/subscription/views.py @@ -14,21 +14,19 @@ # # -from django.views.generic.edit import CreateView, FormView -from django.utils.translation import gettext_lazy as _ -from django.core.exceptions import PermissionDenied, ValidationError -from django.urls import reverse_lazy -from django import forms -from django.conf import settings - -from ajax_select.fields import AutoCompleteSelectField import random -from subscription.models import Subscription -from core.views.forms import SelectDateTime +from ajax_select.fields import AutoCompleteSelectField +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied, ValidationError +from django.urls import reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic.edit import CreateView, FormView + from core.models import User -from core.views.forms import SelectDate -from core.views.forms import TzAwareDateTimeField +from core.views.forms import SelectDate, TzAwareDateTimeField +from subscription.models import Subscription class SelectionDateForm(forms.Form): diff --git a/trombi/migrations/0001_initial.py b/trombi/migrations/0001_initial.py index 0943bad1..3c609c63 100644 --- a/trombi/migrations/0001_initial.py +++ b/trombi/migrations/0001_initial.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models -from django.conf import settings import datetime + import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/trombi/migrations/0004_trombiclubmembership.py b/trombi/migrations/0004_trombiclubmembership.py index 5bb017b4..eb036839 100644 --- a/trombi/migrations/0004_trombiclubmembership.py +++ b/trombi/migrations/0004_trombiclubmembership.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from django.db import migrations, models import django.db.models.deletion +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/trombi/models.py b/trombi/models.py index 18f36526..b5e7d1a8 100644 --- a/trombi/models.py +++ b/trombi/models.py @@ -22,17 +22,17 @@ # # -from django.db import models -from django.utils.translation import gettext_lazy as _ -from django.urls import reverse +from datetime import date + from django.conf import settings from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ -from datetime import timedelta, date - -from core.models import User -from core.utils import get_start_of_semester, get_semester_code from club.models import Club +from core.models import User +from core.utils import get_semester_code class TrombiManager(models.Manager): diff --git a/trombi/tests.py b/trombi/tests.py index de62cd38..087c75b4 100644 --- a/trombi/tests.py +++ b/trombi/tests.py @@ -22,6 +22,4 @@ # # -from django.test import TestCase - # Create your tests here. diff --git a/trombi/views.py b/trombi/views.py index 98bf5fc2..d2bf3231 100644 --- a/trombi/views.py +++ b/trombi/views.py @@ -23,34 +23,33 @@ # # -from django.http import Http404, HttpResponseRedirect -from django.shortcuts import get_object_or_404, redirect -from django.urls import reverse_lazy, reverse -from django.views.generic import DetailView, RedirectView, TemplateView, View -from django.views.generic.edit import UpdateView, CreateView, DeleteView -from django.utils.translation import gettext_lazy as _ -from django import forms -from django.conf import settings -from django.forms.models import modelform_factory -from django.core.exceptions import PermissionDenied - -from ajax_select.fields import AutoCompleteSelectField - from datetime import date -from trombi.models import Trombi, TrombiUser, TrombiComment, TrombiClubMembership -from core.views.forms import SelectDate +from ajax_select.fields import AutoCompleteSelectField +from django import forms +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.forms.models import modelform_factory +from django.http import Http404, HttpResponseRedirect +from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse, reverse_lazy +from django.utils.translation import gettext_lazy as _ +from django.views.generic import DetailView, RedirectView, TemplateView, View +from django.views.generic.edit import CreateView, DeleteView, UpdateView + +from club.models import Club +from core.models import User from core.views import ( - CanViewMixin, + CanCreateMixin, CanEditMixin, CanEditPropMixin, - TabedViewMixin, - CanCreateMixin, + CanViewMixin, QuickNotifMixin, + TabedViewMixin, UserIsLoggedMixin, ) -from core.models import User -from club.models import Club +from core.views.forms import SelectDate +from trombi.models import Trombi, TrombiClubMembership, TrombiComment, TrombiUser class TrombiTabsMixin(TabedViewMixin):