Skip to content

Commit

Permalink
Merge pull request #521 from rafsaf/planer_set_all_time_page
Browse files Browse the repository at this point in the history
add view planer_set_all_time_page
  • Loading branch information
rafsaf authored Sep 10, 2024
2 parents 8ab88c9 + 9531130 commit 10fed82
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 16 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/manual_trigger_stage_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ jobs:
context: .
push: true
tags: rafsaf/twp-server:${{ github.event.inputs.tag }}
platforms: linux/amd64 #,linux/arm64
platforms: linux/amd64,linux/arm64

redeploy_stage:
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/stage_image_push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ jobs:
context: .
push: true
tags: rafsaf/twp-server:stage
platforms: linux/amd64 #,linux/arm64
platforms: linux/amd64,linux/arm64

redeploy_stage:
runs-on: ubuntu-latest
Expand Down
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@
ESBUILD_VERSION=https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz
ESBUILD_PATH=./bin/esbuild

.PHONY: up
up:
docker compose up -d postgres_dev
python manage.py migrate
DJANGO_SUPERUSER_PASSWORD=admin python manage.py createsuperuser --noinput --username admin --email [email protected] || true
python manage.py runserver

.PHONY: trans
trans:
docker compose -f docker-compose.translation.yml run --build --rm trans

bin/esbuild:
mkdir -p ./bin
mkdir /tmp/esbuild
Expand Down
24 changes: 24 additions & 0 deletions base/migrations/0086_alter_periodmodel_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Generated by Django 5.0.6 on 2024-09-10 08:33

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("base", "0085_world_pending_delete"),
]

operations = [
migrations.AlterField(
model_name="periodmodel",
name="status",
field=models.CharField(
choices=[
("all", "All (left)"),
("random", "Random"),
("exact", "Exact"),
],
max_length=15,
),
),
]
12 changes: 12 additions & 0 deletions base/templates/base/new_outline/new_outline_initial_period2_1.html
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,18 @@
</tr>
</thead>
<tbody>
<tr>
<th scope="col"><h2 data-toggle="tooltip" data-placement="top" style="height:48px;width:48px" title="{% trans 'Set time to all targets on this page' %}"><i class="bi bi-arrow-down-square"></i></h2></th>
<th scope="col">
{% for time in outline_time %}
<form style="display:inline" method="POST" action="{% url 'base:planer_set_all_time_page' time.pk %}?page={{ page_obj.number}}&mode={{mode}}&filtr={{ filtr }}">
{% csrf_token %}
<button onclick="this.disabled=true;this.form.submit();" class="btn btn-lg btn-light my-1 py-0 px-1 mr-1">{{time.order}}</button>
</form>
{% endfor %}
</th>
<th colspan="50" scope="colgroup"></th>
</tr>
{% for target, lst in query %}
<tr class="text-center">
<th>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
# Copyright 2024 Rafał Safin (rafsaf). All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

from django.urls import reverse

from base.models import TargetVertex
from base.tests.test_utils.mini_setup import MiniSetup


class InitialSetAllTime(MiniSetup):
def test_planer_set_all_time_page___302_not_auth_redirect_login(self) -> None:
outline = self.get_outline()
outline_time = self.create_outline_time(outline)
PATH = reverse("base:planer_set_all_time_page", args=[outline_time.pk])

response = self.client.get(PATH)
assert response.status_code == 302
response = self.client.post(PATH)
assert response.status_code == 302
assert getattr(response, "url") == self.login_page_path(next=PATH)

def test_planer_set_all_time_page___404_foreign_user_no_access(self) -> None:
outline = self.get_outline()
outline_time = self.create_outline_time(outline)
PATH = reverse("base:planer_set_all_time_page", args=[outline_time.pk])

self.login_foreign_user()
response = self.client.get(PATH)
assert response.status_code == 405

response = self.client.post(PATH)
assert response.status_code == 404

def test_planer_set_all_time_page___302_no_outline_time_on_empty_targets(
self,
) -> None:
outline = self.get_outline()
self.create_target_on_test_world(outline)
self.create_target_on_test_world(outline, fake=True, coord="201|200")
self.create_target_on_test_world(outline, ruin=True, coord="202|200")
outline_time = self.create_outline_time(outline)

PATH = (
reverse("base:planer_set_all_time_page", args=[outline_time.pk])
+ "?page=1&mode=time&filtr="
)
REDIRECT = (
reverse("base:planer_initial", args=[outline.pk])
+ "?page=1&mode=time&filtr="
)

self.login_me()
response = self.client.post(PATH)
assert response.status_code == 302
assert getattr(response, "url") == REDIRECT

assert TargetVertex.objects.filter(outline_time=outline_time).count() == 0

def test_planer_set_all_time_page___302_proper_outline_time_on_targets(
self,
) -> None:
outline = self.get_outline()
self.create_target_on_test_world(outline, many=5)
targets = list(TargetVertex.objects.filter(outline=outline))
for i in range(5):
weight_max = self.create_weight_maximum(outline=outline)
self.create_weight(target=targets[i], weight_max=weight_max)

outline_time = self.create_outline_time(outline)

PATH = (
reverse("base:planer_set_all_time_page", args=[outline_time.pk])
+ "?page=1&mode=time&filtr="
)
REDIRECT = (
reverse("base:planer_initial", args=[outline.pk])
+ "?page=1&mode=time&filtr="
)

self.login_me()
response = self.client.post(PATH)
assert response.status_code == 302
assert getattr(response, "url") == REDIRECT

assert TargetVertex.objects.filter(outline_time=outline_time).count() == 5

def test_planer_set_all_time_page___302_proper_outline_time_on_targets_only_2_page(
self,
) -> None:
outline = self.get_outline()
outline.filter_targets_number = 2
outline.save()
self.create_target_on_test_world(outline, many=5)
targets = list(TargetVertex.objects.filter(outline=outline).order_by("pk"))
for i in range(5):
weight_max = self.create_weight_maximum(outline=outline)
self.create_weight(target=targets[i], weight_max=weight_max)

outline_time = self.create_outline_time(outline)

PATH = (
reverse("base:planer_set_all_time_page", args=[outline_time.pk])
+ "?page=2&mode=time"
)
REDIRECT = (
reverse("base:planer_initial", args=[outline.pk])
+ "?page=2&mode=time&filtr="
)

self.login_me()
response = self.client.post(PATH)
assert response.status_code == 302
assert getattr(response, "url") == REDIRECT

targets = list(TargetVertex.objects.filter(outline=outline).order_by("pk"))
assert TargetVertex.objects.filter(outline_time=outline_time).count() == 2
assert targets[2].outline_time == outline_time
assert targets[3].outline_time == outline_time

def test_planer_set_all_time_page___302_respects_filter_param(
self,
) -> None:
outline = self.get_outline()
self.create_target_on_test_world(outline, many=5)
targets = list(TargetVertex.objects.filter(outline=outline).order_by("pk"))

test_target_pk = targets[4].pk
for i in range(5):
weight_max = self.create_weight_maximum(outline=outline)
self.create_weight(target=targets[i], weight_max=weight_max)
if i == 4:
self.create_weight(target=targets[i], weight_max=weight_max)

outline_time = self.create_outline_time(outline)

PATH = (
reverse("base:planer_set_all_time_page", args=[outline_time.pk])
+ "?page=1&mode=time&filtr=command>1"
)
REDIRECT = (
reverse("base:planer_initial", args=[outline.pk])
+ "?page=1&mode=time&filtr=command%3E1"
)

self.login_me()
response = self.client.post(PATH)
assert response.status_code == 302
assert getattr(response, "url") == REDIRECT

assert TargetVertex.objects.filter(outline_time=outline_time).count() == 1
assert TargetVertex.objects.get(pk=test_target_pk).outline_time == outline_time
6 changes: 6 additions & 0 deletions base/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
initial_form,
initial_planer,
initial_set_all_time,
initial_set_all_time_page,
initial_target,
)
from base.views.profile import add_world, payment_done, premium_view, profile_settings
Expand Down Expand Up @@ -129,6 +130,11 @@
initial_set_all_time,
name="planer_set_all_time",
),
path(
"planer/planer-menu/set-all-time-page/<int:pk>",
initial_set_all_time_page,
name="planer_set_all_time_page",
),
path(
"planer/<int:id1>/planer-target/<int:id2>",
initial_target,
Expand Down
32 changes: 32 additions & 0 deletions base/views/outline_initial_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

import metrics
from base import forms, models
from base.models.target_vertex import TargetVertex
from utils import avaiable_troops, basic
from utils.outline_complete import complete_outline_write
from utils.outline_create_targets import OutlineCreateTargets
Expand Down Expand Up @@ -829,6 +830,37 @@ def initial_set_all_time(request: HttpRequest, pk: int) -> HttpResponse:
)


@login_required
@require_POST
def initial_set_all_time_page(request: HttpRequest, pk: int) -> HttpResponse:
outline_time: models.OutlineTime = get_object_or_404(
models.OutlineTime.objects.select_related(), pk=pk
)
outline: models.Outline = get_object_or_404(
models.Outline, owner=request.user, id=outline_time.outline.pk
)
mode = request.GET.get("mode")
page = request.GET.get("page")
filtr = request.GET.get("filtr") or ""

page_obj = outline.pagin_targets(
page=page,
every=True,
not_empty_only=True,
related=True,
filtr=filtr,
)

TargetVertex.objects.filter(
outline=outline, id__in=[target.pk for target in page_obj]
).update(outline_time=outline_time)

return redirect(
reverse("base:planer_initial", args=[outline.pk])
+ f"?page={page}&mode={mode}&filtr={filtr}"
)


@login_required
@require_POST
def complete_outline(request: HttpRequest, id1: int) -> HttpResponse:
Expand Down
Binary file modified locale/pl/LC_MESSAGES/django.mo
Binary file not shown.
Loading

0 comments on commit 10fed82

Please sign in to comment.