diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fc305cd3b..f4020074f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,8 +6,3 @@ updates: interval: daily time: "10:00" open-pull-requests-limit: 10 - ignore: - - dependency-name: django - versions: - - ">= 3.a" - - "< 4" diff --git a/README.md b/README.md index d98471587..eb3ea51ce 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,6 @@ You can add flags to speed up the tests If you want to check your test coverage, you can do the following ```bash -# Install the packages needed -$ pip install -r requirements/coverage.txt - # Run all tests in LEGO. Remember to add the recommended flags mentioned above $ tox -e tests -- # or run without tox diff --git a/lego/api/tests/test_authentication.py b/lego/api/tests/test_authentication.py index fc1dda5e4..bfee27276 100644 --- a/lego/api/tests/test_authentication.py +++ b/lego/api/tests/test_authentication.py @@ -1,3 +1,4 @@ +from rest_framework import status from rest_framework.reverse import reverse from lego.apps.users.models import User @@ -35,8 +36,8 @@ def check_user(self, user): def test_authenticate(self): response = self.client.post(reverse("jwt:obtain_jwt_token"), self.user_data) - self.assertContains(response, "token") - self.assertContains(response, "user") + self.assertContains(response, text="token", status_code=status.HTTP_201_CREATED) + self.assertContains(response, text="user", status_code=status.HTTP_201_CREATED) def test_refresh(self): token_response = self.client.post( @@ -47,5 +48,23 @@ def test_refresh(self): reverse("jwt:refresh_jwt_token"), token_data ) - self.assertContains(refresh_response, "token") - self.assertContains(token_response, "user") + self.assertContains( + refresh_response, text="token", status_code=status.HTTP_201_CREATED + ) + self.assertContains( + refresh_response, text="user", status_code=status.HTTP_201_CREATED + ) + + def test_verify(self): + token_response = self.client.post( + reverse("jwt:obtain_jwt_token"), self.user_data + ) + token_data = {"token": token_response.json()["token"]} + verify_response = self.client.post(reverse("jwt:verify_jwt_token"), token_data) + + self.assertContains( + verify_response, text="token", status_code=status.HTTP_201_CREATED + ) + self.assertContains( + verify_response, text="user", status_code=status.HTTP_201_CREATED + ) diff --git a/lego/api/urls.py b/lego/api/urls.py index 7b06bac64..535fdbf6f 100644 --- a/lego/api/urls.py +++ b/lego/api/urls.py @@ -1,7 +1,7 @@ from django.conf import settings -from django.conf.urls import include, url +from django.conf.urls import include from django.http import Http404, HttpResponseRedirect -from django.urls import resolve +from django.urls import re_path, resolve from django.views.decorators.csrf import csrf_exempt from django.views.generic import RedirectView @@ -22,9 +22,9 @@ def version_redirect(request, path): app_name = "api" urlpatterns = [ - url(r"^v1/", include((v1.urls, "v1"), namespace="v1")), - url( + re_path(r"^v1/", include((v1.urls, "v1"), namespace="v1")), + re_path( r"^$", RedirectView.as_view(url=f"/api/{settings.API_VERSION}/"), name="default" ), - url(r"^(.*)/$", version_redirect), + re_path(r"^(.*)/$", version_redirect), ] diff --git a/lego/apps/articles/migrations/0010_alter_article_can_edit_groups_and_more.py b/lego/apps/articles/migrations/0010_alter_article_can_edit_groups_and_more.py new file mode 100644 index 000000000..f64c4758b --- /dev/null +++ b/lego/apps/articles/migrations/0010_alter_article_can_edit_groups_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("users", "0033_alter_abakusgroup_type"), + ("articles", "0009_article_youtube_url"), + ] + + operations = [ + migrations.AlterField( + model_name="article", + name="can_edit_groups", + field=models.ManyToManyField( + blank=True, related_name="can_edit_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="article", + name="can_edit_users", + field=models.ManyToManyField( + blank=True, + related_name="can_edit_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="article", + name="can_view_groups", + field=models.ManyToManyField( + blank=True, related_name="can_view_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="article", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="article", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/comments/migrations/0008_alter_comment_created_by_alter_comment_updated_by.py b/lego/apps/comments/migrations/0008_alter_comment_created_by_alter_comment_updated_by.py new file mode 100644 index 000000000..6bddb0872 --- /dev/null +++ b/lego/apps/comments/migrations/0008_alter_comment_created_by_alter_comment_updated_by.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("comments", "0007_auto_20190306_1508"), + ] + + operations = [ + migrations.AlterField( + model_name="comment", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="comment", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/companies/migrations/0024_alter_company_created_by_alter_company_updated_by_and_more.py b/lego/apps/companies/migrations/0024_alter_company_created_by_alter_company_updated_by_and_more.py new file mode 100644 index 000000000..2921a0da0 --- /dev/null +++ b/lego/apps/companies/migrations/0024_alter_company_created_by_alter_company_updated_by_and_more.py @@ -0,0 +1,88 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("companies", "0023_alter_semesterstatus_contacted_status"), + ] + + operations = [ + migrations.AlterField( + model_name="company", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="company", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="companycontact", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="companycontact", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="semester", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="semester", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/permissions/tests/migrations/0003_auto_20171210_2040.py b/lego/apps/emojis/migrations/0002_alter_emoji_created_by_alter_emoji_updated_by.py similarity index 70% rename from lego/apps/permissions/tests/migrations/0003_auto_20171210_2040.py rename to lego/apps/emojis/migrations/0002_alter_emoji_created_by_alter_emoji_updated_by.py index 3c5658ae1..678106318 100644 --- a/lego/apps/permissions/tests/migrations/0003_auto_20171210_2040.py +++ b/lego/apps/emojis/migrations/0002_alter_emoji_created_by_alter_emoji_updated_by.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0 on 2017-12-10 20:40 +# Generated by Django 4.0.6 on 2022-07-26 11:56 import django.db.models.deletion from django.conf import settings @@ -7,30 +7,33 @@ class Migration(migrations.Migration): - dependencies = [("tests", "0002_auto_20170903_2224")] + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("emojis", "0001_initial"), + ] operations = [ migrations.AlterField( - model_name="testmodel", + model_name="emoji", name="created_by", field=models.ForeignKey( default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, - related_name="testmodel_created", + related_name="%(class)s_created", to=settings.AUTH_USER_MODEL, ), ), migrations.AlterField( - model_name="testmodel", + model_name="emoji", name="updated_by", field=models.ForeignKey( default=None, editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, - related_name="testmodel_updated", + related_name="%(class)s_updated", to=settings.AUTH_USER_MODEL, ), ), diff --git a/lego/apps/events/migrations/0033_alter_event_can_edit_groups_and_more.py b/lego/apps/events/migrations/0033_alter_event_can_edit_groups_and_more.py new file mode 100644 index 000000000..d3f94dfca --- /dev/null +++ b/lego/apps/events/migrations/0033_alter_event_can_edit_groups_and_more.py @@ -0,0 +1,112 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("users", "0033_alter_abakusgroup_type"), + ("events", "0032_event_mazemap_poi"), + ] + + operations = [ + migrations.AlterField( + model_name="event", + name="can_edit_groups", + field=models.ManyToManyField( + blank=True, related_name="can_edit_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="event", + name="can_edit_users", + field=models.ManyToManyField( + blank=True, + related_name="can_edit_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="event", + name="can_view_groups", + field=models.ManyToManyField( + blank=True, related_name="can_view_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="event", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="event", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="pool", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="pool", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="registration", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="registration", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/events/notifications.py b/lego/apps/events/notifications.py index 46f96eb0f..ab6298dad 100644 --- a/lego/apps/events/notifications.py +++ b/lego/apps/events/notifications.py @@ -1,6 +1,6 @@ -from django.utils import timezone +from zoneinfo import ZoneInfo -import pytz +from django.utils import timezone from lego.apps.notifications.constants import ( EVENT_ADMIN_REGISTRATION, @@ -49,7 +49,7 @@ def generate_mail(self): event = self.kwargs["event"] date = timezone.localtime( - value=event.payment_due_date, timezone=pytz.timezone("Europe/Oslo") + value=event.payment_due_date, timezone=ZoneInfo("Europe/Oslo") ) due_date = date.strftime("%d.%m.%y, kl. %H:%M") diff --git a/lego/apps/events/serializers/registrations.py b/lego/apps/events/serializers/registrations.py index 761165375..9ad33271d 100644 --- a/lego/apps/events/serializers/registrations.py +++ b/lego/apps/events/serializers/registrations.py @@ -1,7 +1,7 @@ from django.db import transaction from rest_framework import serializers -from rest_framework_jwt.serializers import User +from rest_framework_jwt.serializers import ImpersonateAuthTokenSerializer from lego.apps.events import constants from lego.apps.events.fields import ( @@ -14,6 +14,7 @@ SetPaymentStatusField, ) from lego.apps.events.models import Pool, Registration +from lego.apps.users.models import User as user_model from lego.apps.users.serializers.users import ( AdministrateUserExportSerializer, AdministrateUserSerializer, @@ -22,6 +23,8 @@ from lego.utils.fields import PrimaryKeyRelatedFieldNoPKOpt from lego.utils.serializers import BasisModelSerializer +User: user_model = ImpersonateAuthTokenSerializer.User + class AdminUnregisterSerializer(serializers.Serializer): user = PrimaryKeyRelatedFieldNoPKOpt(queryset=User.objects.all()) diff --git a/lego/apps/flatpages/migrations/0011_alter_page_can_edit_groups_alter_page_can_edit_users_and_more.py b/lego/apps/flatpages/migrations/0011_alter_page_can_edit_groups_alter_page_can_edit_users_and_more.py new file mode 100644 index 000000000..502105da0 --- /dev/null +++ b/lego/apps/flatpages/migrations/0011_alter_page_can_edit_groups_alter_page_can_edit_users_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-08-13 21:48 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("users", "0034_alter_membership_created_by_and_more"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("flatpages", "0010_alter_page_category"), + ] + + operations = [ + migrations.AlterField( + model_name="page", + name="can_edit_groups", + field=models.ManyToManyField( + blank=True, related_name="can_edit_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="page", + name="can_edit_users", + field=models.ManyToManyField( + blank=True, + related_name="can_edit_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="page", + name="can_view_groups", + field=models.ManyToManyField( + blank=True, related_name="can_view_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="page", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="page", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/gallery/migrations/0008_alter_gallery_can_edit_groups_and_more.py b/lego/apps/gallery/migrations/0008_alter_gallery_can_edit_groups_and_more.py new file mode 100644 index 000000000..a767cdd28 --- /dev/null +++ b/lego/apps/gallery/migrations/0008_alter_gallery_can_edit_groups_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("users", "0033_alter_abakusgroup_type"), + ("gallery", "0007_gallery_public_metadata"), + ] + + operations = [ + migrations.AlterField( + model_name="gallery", + name="can_edit_groups", + field=models.ManyToManyField( + blank=True, related_name="can_edit_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="gallery", + name="can_edit_users", + field=models.ManyToManyField( + blank=True, + related_name="can_edit_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="gallery", + name="can_view_groups", + field=models.ManyToManyField( + blank=True, related_name="can_view_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="gallery", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="gallery", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/joblistings/migrations/0009_alter_joblisting_created_by_and_more.py b/lego/apps/joblistings/migrations/0009_alter_joblisting_created_by_and_more.py new file mode 100644 index 000000000..69b20ea78 --- /dev/null +++ b/lego/apps/joblistings/migrations/0009_alter_joblisting_created_by_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("joblistings", "0008_joblisting_youtube_url"), + ] + + operations = [ + migrations.AlterField( + model_name="joblisting", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="joblisting", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="workplace", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="workplace", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/jwt/handlers.py b/lego/apps/jwt/handlers.py index 002b0276d..cdb41eb1c 100644 --- a/lego/apps/jwt/handlers.py +++ b/lego/apps/jwt/handlers.py @@ -7,7 +7,11 @@ jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER -def response_handler(token, user=None, request=None): +def response_handler(token, user=None, request=None, issued_at=None): + """ + Return response data for both the login and the refresh views, + which includes the serialized representation of the User. + """ track(user, "authenticate") return {"token": token, "user": MeSerializer(user).data} diff --git a/lego/apps/meetings/migrations/0009_alter_meeting_created_by_alter_meeting_updated_by_and_more.py b/lego/apps/meetings/migrations/0009_alter_meeting_created_by_alter_meeting_updated_by_and_more.py new file mode 100644 index 000000000..e159caef3 --- /dev/null +++ b/lego/apps/meetings/migrations/0009_alter_meeting_created_by_alter_meeting_updated_by_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("meetings", "0008_meeting_mazemap_poi"), + ] + + operations = [ + migrations.AlterField( + model_name="meeting", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="meeting", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="meetinginvitation", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="meetinginvitation", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/meetings/notifications.py b/lego/apps/meetings/notifications.py index c31483e66..32842f48c 100644 --- a/lego/apps/meetings/notifications.py +++ b/lego/apps/meetings/notifications.py @@ -1,6 +1,6 @@ -from django.utils import timezone +from zoneinfo import ZoneInfo -import pytz +from django.utils import timezone from lego.apps.notifications.constants import MEETING_INVITE from lego.apps.notifications.notification import Notification @@ -15,7 +15,7 @@ def generate_mail(self): meeting = meeting_invitation.meeting token = meeting_invitation.generate_invitation_token() time = timezone.localtime( - value=meeting.start_time, timezone=pytz.timezone("Europe/Oslo") + value=meeting.start_time, timezone=ZoneInfo("Europe/Oslo") ) author = ( meeting.report_author.full_name if meeting.report_author else "Ikke valgt" diff --git a/lego/apps/notifications/migrations/0012_alter_announcement_created_by_and_more.py b/lego/apps/notifications/migrations/0012_alter_announcement_created_by_and_more.py new file mode 100644 index 000000000..4bbc9dd5a --- /dev/null +++ b/lego/apps/notifications/migrations/0012_alter_announcement_created_by_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("notifications", "0011_inactive_deleted_warning"), + ] + + operations = [ + migrations.AlterField( + model_name="announcement", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="announcement", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/oauth/migrations/0003_alter_apiapplication_user.py b/lego/apps/oauth/migrations/0003_alter_apiapplication_user.py new file mode 100644 index 000000000..c67aadff8 --- /dev/null +++ b/lego/apps/oauth/migrations/0003_alter_apiapplication_user.py @@ -0,0 +1,27 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("oauth", "0002_auto_20211018_2036"), + ] + + operations = [ + migrations.AlterField( + model_name="apiapplication", + name="user", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/oauth/urls.py b/lego/apps/oauth/urls.py index d53b06148..113afd3a5 100644 --- a/lego/apps/oauth/urls.py +++ b/lego/apps/oauth/urls.py @@ -1,13 +1,13 @@ from __future__ import absolute_import -from django.conf.urls import url +from django.urls import re_path from oauth2_provider import views from .views import LegoAuthorizationView urlpatterns = ( - url(r"^authorize/$", LegoAuthorizationView.as_view(), name="authorize"), - url(r"^token/$", views.TokenView.as_view(), name="token"), - url(r"^revoke_token/$", views.RevokeTokenView.as_view(), name="revoke-token"), + re_path(r"^authorize/$", LegoAuthorizationView.as_view(), name="authorize"), + re_path(r"^token/$", views.TokenView.as_view(), name="token"), + re_path(r"^revoke_token/$", views.RevokeTokenView.as_view(), name="revoke-token"), ) diff --git a/lego/apps/permissions/tests/migrations/0002_alter_testmodel_can_edit_groups_and_more.py b/lego/apps/permissions/tests/migrations/0002_alter_testmodel_can_edit_groups_and_more.py new file mode 100644 index 000000000..af73fbc3f --- /dev/null +++ b/lego/apps/permissions/tests/migrations/0002_alter_testmodel_can_edit_groups_and_more.py @@ -0,0 +1,69 @@ +# Generated by Django 4.0.6 on 2022-08-13 22:17 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("users", "0034_alter_membership_created_by_and_more"), + ("tests", "0001_initial"), + ] + + operations = [ + migrations.AlterField( + model_name="testmodel", + name="can_edit_groups", + field=models.ManyToManyField( + blank=True, related_name="can_edit_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="testmodel", + name="can_edit_users", + field=models.ManyToManyField( + blank=True, + related_name="can_edit_%(class)s", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="testmodel", + name="can_view_groups", + field=models.ManyToManyField( + blank=True, related_name="can_view_%(class)s", to="users.abakusgroup" + ), + ), + migrations.AlterField( + model_name="testmodel", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="testmodel", + name="require_auth", + field=models.BooleanField(default=True), + ), + migrations.AlterField( + model_name="testmodel", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/permissions/tests/migrations/0002_auto_20170903_2224.py b/lego/apps/permissions/tests/migrations/0002_auto_20170903_2224.py deleted file mode 100644 index 1136cbfc5..000000000 --- a/lego/apps/permissions/tests/migrations/0002_auto_20170903_2224.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11.4 on 2017-09-03 22:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [("tests", "0001_initial")] - - operations = [ - migrations.AlterField( - model_name="testmodel", - name="require_auth", - field=models.BooleanField(default=True), - ) - ] diff --git a/lego/apps/podcasts/migrations/0006_alter_podcast_created_by_alter_podcast_updated_by.py b/lego/apps/podcasts/migrations/0006_alter_podcast_created_by_alter_podcast_updated_by.py new file mode 100644 index 000000000..70e93b1fb --- /dev/null +++ b/lego/apps/podcasts/migrations/0006_alter_podcast_created_by_alter_podcast_updated_by.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("podcasts", "0005_auto_20181017_2023"), + ] + + operations = [ + migrations.AlterField( + model_name="podcast", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="podcast", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/polls/migrations/0003_alter_option_created_by_alter_option_updated_by_and_more.py b/lego/apps/polls/migrations/0003_alter_option_created_by_alter_option_updated_by_and_more.py new file mode 100644 index 000000000..23b65b2b9 --- /dev/null +++ b/lego/apps/polls/migrations/0003_alter_option_created_by_alter_option_updated_by_and_more.py @@ -0,0 +1,64 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("polls", "0002_poll_results_hidden"), + ] + + operations = [ + migrations.AlterField( + model_name="option", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="option", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="poll", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="poll", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/quotes/migrations/0007_alter_quote_created_by_alter_quote_updated_by.py b/lego/apps/quotes/migrations/0007_alter_quote_created_by_alter_quote_updated_by.py new file mode 100644 index 000000000..8bbab8ef8 --- /dev/null +++ b/lego/apps/quotes/migrations/0007_alter_quote_created_by_alter_quote_updated_by.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("quotes", "0006_auto_20171210_1610"), + ] + + operations = [ + migrations.AlterField( + model_name="quote", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="quote", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/reactions/migrations/0005_alter_reaction_created_by_alter_reaction_updated_by.py b/lego/apps/reactions/migrations/0005_alter_reaction_created_by_alter_reaction_updated_by.py new file mode 100644 index 000000000..a2a0f0cd4 --- /dev/null +++ b/lego/apps/reactions/migrations/0005_alter_reaction_created_by_alter_reaction_updated_by.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("reactions", "0004_auto_20190902_1731"), + ] + + operations = [ + migrations.AlterField( + model_name="reaction", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="reaction", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/restricted/migrations/0005_alter_restrictedmail_created_by_and_more.py b/lego/apps/restricted/migrations/0005_alter_restrictedmail_created_by_and_more.py new file mode 100644 index 000000000..142a4731c --- /dev/null +++ b/lego/apps/restricted/migrations/0005_alter_restrictedmail_created_by_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("restricted", "0004_auto_20210510_0848"), + ] + + operations = [ + migrations.AlterField( + model_name="restrictedmail", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="restrictedmail", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/surveys/migrations/0010_alter_answer_created_by_alter_answer_updated_by_and_more.py b/lego/apps/surveys/migrations/0010_alter_answer_created_by_alter_answer_updated_by_and_more.py new file mode 100644 index 000000000..5f75c7d40 --- /dev/null +++ b/lego/apps/surveys/migrations/0010_alter_answer_created_by_alter_answer_updated_by_and_more.py @@ -0,0 +1,88 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("surveys", "0009_merge_20200303_1928"), + ] + + operations = [ + migrations.AlterField( + model_name="answer", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="answer", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="submission", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="submission", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="survey", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="survey", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/lego/apps/users/migrations/0034_alter_membership_created_by_and_more.py b/lego/apps/users/migrations/0034_alter_membership_created_by_and_more.py new file mode 100644 index 000000000..fa4d6ef24 --- /dev/null +++ b/lego/apps/users/migrations/0034_alter_membership_created_by_and_more.py @@ -0,0 +1,75 @@ +# Generated by Django 4.0.6 on 2022-07-26 11:56 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("email", "0009_auto_20210326_1332"), + ("users", "0033_alter_abakusgroup_type"), + ] + + operations = [ + migrations.AlterField( + model_name="membership", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="membership", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="penalty", + name="created_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="penalty", + name="updated_by", + field=models.ForeignKey( + default=None, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_updated", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="user", + name="internal_email", + field=models.OneToOneField( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s", + to="email.emailaddress", + ), + ), + ] diff --git a/lego/apps/websockets/routing.py b/lego/apps/websockets/routing.py index a98537d39..e17af04b5 100644 --- a/lego/apps/websockets/routing.py +++ b/lego/apps/websockets/routing.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.conf.urls import url +from django.urls import re_path from channels.routing import ProtocolTypeRouter, URLRouter from structlog import get_logger @@ -26,7 +26,7 @@ async def __call__(self, scope): protocols = { "websocket": JWTAuthenticationMiddleware( - URLRouter([url("^$", GroupConsumer.as_asgi())]) + URLRouter([re_path("^$", GroupConsumer.as_asgi())]) ) } diff --git a/lego/settings/base.py b/lego/settings/base.py index 8f6d19107..d1a8ab373 100644 --- a/lego/settings/base.py +++ b/lego/settings/base.py @@ -21,6 +21,8 @@ "django_extensions", "oauth2_provider", "rest_framework", + "rest_framework_jwt", + "rest_framework_jwt.blacklist", # Not used, but needed to avoid db issues. "corsheaders", "mptt", "channels", @@ -114,9 +116,9 @@ ] JWT_AUTH = { + "JWT_RESPONSE_PAYLOAD_HANDLER": "lego.apps.jwt.handlers.response_handler", # Tokens will expire after 14 days "JWT_EXPIRATION_DELTA": datetime.timedelta(days=14), - "JWT_RESPONSE_PAYLOAD_HANDLER": "lego.apps.jwt.handlers.response_handler", # Allow refresh. Tokens can be refreshed for 180 days after initial login, # so users must login ~twice a year "JWT_ALLOW_REFRESH": True, @@ -124,6 +126,9 @@ } OAUTH2_PROVIDER_APPLICATION_MODEL = "oauth.APIApplication" +OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = "oauth2_provider.AccessToken" +OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = "oauth2_provider.RefreshToken" +OAUTH2_PROVIDER_ID_TOKEN_MODEL = "oauth2_provider.IDToken" # Tokens is valid for 7 days. OAUTH2_PROVIDER = { "ACCESS_TOKEN_EXPIRE_SECONDS": 86400 * 7, diff --git a/lego/settings/development.py b/lego/settings/development.py index 8c639fa2c..4b9d07f5c 100644 --- a/lego/settings/development.py +++ b/lego/settings/development.py @@ -44,7 +44,7 @@ EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend" INTERNAL_IPS = ["127.0.0.1"] -INSTALLED_APPS += ["debug_toolbar"] +INSTALLED_APPS += ["coverage", "debug_toolbar"] MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"] DEBUG_TOOLBAR_PANELS = [ "debug_toolbar.panels.versions.VersionsPanel", diff --git a/lego/settings/rest_framework.py b/lego/settings/rest_framework.py index 9bc88b97d..25b9d4dd7 100644 --- a/lego/settings/rest_framework.py +++ b/lego/settings/rest_framework.py @@ -1,8 +1,8 @@ REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "lego.apps.oauth.authentication.Authentication", - "rest_framework.authentication.SessionAuthentication", "lego.apps.jwt.authentication.Authentication", + "rest_framework.authentication.SessionAuthentication", ], "DEFAULT_RENDERER_CLASSES": ["lego.utils.renderers.JSONRenderer"], "DEFAULT_PARSER_CLASSES": [ diff --git a/lego/settings/test.py b/lego/settings/test.py index 006f897f6..2754ebd93 100644 --- a/lego/settings/test.py +++ b/lego/settings/test.py @@ -1,12 +1,9 @@ -import logging import os import stripe from .base import CHANNEL_LAYERS, INSTALLED_APPS -logging.disable(logging.CRITICAL) - # Disable migrations for all apps (not on CI): if "DRONE" not in os.environ: MIGRATION_MODULES = { diff --git a/lego/urls.py b/lego/urls.py index 3b04b3da6..edf799e78 100644 --- a/lego/urls.py +++ b/lego/urls.py @@ -1,7 +1,7 @@ from django.conf import settings -from django.conf.urls import include, url +from django.conf.urls import include from django.contrib.auth.views import LoginView, LogoutView -from django.urls import path +from django.urls import path, re_path from django.views.generic import TemplateView from rest_framework.documentation import include_docs_urls @@ -14,27 +14,27 @@ from lego.api.urls import urlpatterns as api jwt_urlpatterns = [ - url(r"^token-auth/$", obtain_jwt_token, name="obtain_jwt_token"), - url(r"^token-auth/refresh/$", refresh_jwt_token, name="refresh_jwt_token"), - url(r"^token-auth/verify/$", verify_jwt_token, name="verify_jwt_token"), + re_path(r"^token-auth/$", obtain_jwt_token, name="obtain_jwt_token"), + re_path(r"^token-auth/refresh/$", refresh_jwt_token, name="refresh_jwt_token"), + re_path(r"^token-auth/verify/$", verify_jwt_token, name="verify_jwt_token"), ] authorization_urlpatterns = [ - url(r"^oauth2/", include("lego.apps.oauth.urls")), - url(r"", include((jwt_urlpatterns, "jwt"), namespace="jwt")), - url( + re_path(r"^oauth2/", include("lego.apps.oauth.urls")), + re_path(r"", include((jwt_urlpatterns, "jwt"), namespace="jwt")), + re_path( r"^login/", LoginView.as_view(template_name="authorization/login.html"), name="login", ), - url(r"^logout/", LogoutView.as_view(next_page="/"), name="logout"), + re_path(r"^logout/", LogoutView.as_view(next_page="/"), name="logout"), ] urlpatterns = [ - url(r"^api/", include("lego.api.urls", namespace="api")), - url(r"^authorization/", include(authorization_urlpatterns)), - url(r"^health/", include("health_check.urls")), - url( + re_path(r"^api/", include("lego.api.urls", namespace="api")), + re_path(r"^authorization/", include(authorization_urlpatterns)), + re_path(r"^health/", include("health_check.urls")), + re_path( r"^api-docs/", include_docs_urls( # type: ignore title=settings.SITE["name"], @@ -43,7 +43,9 @@ schema_url="/api", ), ), - url(r"^$", TemplateView.as_view(template_name="landing.html"), name="landing_page"), + re_path( + r"^$", TemplateView.as_view(template_name="landing.html"), name="landing_page" + ), ] if "debug_toolbar" in settings.INSTALLED_APPS: diff --git a/lego/utils/test_utils.py b/lego/utils/test_utils.py index 92a40b6bc..fbd067066 100644 --- a/lego/utils/test_utils.py +++ b/lego/utils/test_utils.py @@ -1,7 +1,7 @@ import functools +from datetime import datetime, timezone from django.test import TestCase -from django.utils import timezone from rest_framework.test import APITestCase, APITransactionTestCase @@ -23,9 +23,8 @@ def assertStatusCode(self, response, code=200): def fake_time(y, m, d): - dt = timezone.datetime(y, m, d) - dt = timezone.pytz.timezone("UTC").localize(dt) - return dt + dt = datetime(y, m, d) + return dt.replace(tzinfo=timezone.utc) def async_test(f): diff --git a/requirements/base.txt b/requirements/base.txt index 01e98a697..eabbdc912 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,4 +1,4 @@ -django==3.2.14 +django==4.0.6 ipython==8.4.0 @@ -12,7 +12,7 @@ elasticsearch==7.16.2 celery==5.2.7 stripe==3.4.0 boto3==1.24.56 -bs4==0.0.1 +beautifulsoup4==4.11.1 bleach==5.0.1 requests==2.28.1 ldap3==2.9.1 @@ -36,7 +36,7 @@ daphne==3.0.2 flatbuffers==2.0 djangorestframework==3.13.1 -djangorestframework-jwt==1.11.0 +drf-jwt==1.19.2 djangorestframework-camel-case==1.3.0 django-extensions==3.2.0 django-autoslug==1.9.8 @@ -48,7 +48,7 @@ django-environ==0.9.0 django-redis==5.2.0 django-ipware==4.0.2 django-phonenumber-field[phonenumberslite]==6.3.0 -django-push-notifications==2.0.0 +django-push-notifications==3.0.0 # Ical-export django-ical==1.8.3 diff --git a/requirements/dev.txt b/requirements/dev.txt index 5bdc983a7..c968e3401 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,10 +1,10 @@ -r base.txt -r docs.txt - -django-debug-toolbar==3.6.0 -tox==3.25.1 - +-r coverage.txt -r flake8.txt -r isort.txt -r black.txt -r mypy.txt + +django-debug-toolbar==3.6.0 +tox==3.25.1 diff --git a/requirements/mypy.txt b/requirements/mypy.txt index 64d9c1dba..ebb751547 100644 --- a/requirements/mypy.txt +++ b/requirements/mypy.txt @@ -7,7 +7,6 @@ types-certifi==2021.10.8.3 types-docutils==0.19.0 types-Markdown==3.4.0 types-python-slugify==6.1.0 -types-pytz==2022.1.2 types-PyYAML==6.0.11 types-requests==2.28.9 types-six==1.16.18 diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index c52e994a5..000000000 --- a/requirements/test.txt +++ /dev/null @@ -1,3 +0,0 @@ --r base.txt -# Stack traces for --parallel tests: -tblib diff --git a/tox.ini b/tox.ini index 2d35c7311..e442f6de3 100644 --- a/tox.ini +++ b/tox.ini @@ -17,8 +17,7 @@ commands = [testenv:tests] deps = - -r{toxinidir}/requirements/test.txt - -r{toxinidir}/requirements/coverage.txt + -r{toxinidir}/requirements/dev.txt whitelist_externals = /usr/bin/make setenv = @@ -37,7 +36,7 @@ commands = [testenv:missing-migrations] deps = - -r{toxinidir}/requirements/test.txt + -r{toxinidir}/requirements/dev.txt setenv = DJANGO_SETTINGS_MODULE=lego.settings PYTHONPATH = {toxinidir}:{toxinidir}