Skip to content

Commit 8655472

Browse files
authored
Merge pull request #400 from wikimediabrasil/multiple-previews
Multiple previews
2 parents 370376b + e20500b commit 8655472

File tree

6 files changed

+137
-85
lines changed

6 files changed

+137
-85
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Generated by Django 5.0.9 on 2025-12-02 16:39
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('core', '0039_rename_batchcommand_batch_index_core_batchc_batch_i_88990f_idx_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.DeleteModel(
14+
name='BatchEditingSession',
15+
),
16+
]

src/core/models.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from django.db.models import Q
2020
from django.utils import timezone
2121
from django.utils.translation import pgettext_lazy
22+
from django.utils.timezone import now
2223
from requests.exceptions import HTTPError
2324
from urllib3.util.retry import Retry
2425

@@ -749,6 +750,21 @@ def write_report(self, csvfile):
749750
]
750751
)
751752

753+
# ------
754+
# Utility, probably should be moved to a BatchManager
755+
# ------
756+
@classmethod
757+
def delete_old_previews(cls, username: str):
758+
"""
759+
Delete batches in PREVIEW older than a week ago for this user.
760+
"""
761+
a_week_ago = now() - timedelta(days=7)
762+
return cls.objects.filter(
763+
status=cls.STATUS_PREVIEW,
764+
user=username,
765+
created__lte=a_week_ago,
766+
).delete()
767+
752768

753769
class BatchCommand(models.Model):
754770
"""
@@ -1855,8 +1871,3 @@ def should_verify_value_types(self):
18551871
is_not_verified_yet = not self.value_type_verified
18561872
is_needed_actions = self.is_add_statement()
18571873
return is_not_verified_yet and is_needed_actions
1858-
1859-
1860-
class BatchEditingSession(models.Model):
1861-
batch = models.OneToOneField(Batch, related_name="editing_session", on_delete=models.CASCADE)
1862-
session_key = models.CharField(max_length=64, blank=True, null=True, db_index=True)

src/web/templates/preview_batch.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ <h2> {% translate 'Batch Preview' context 'preview-batch-batch-preview' %} <img
2626
</hgroup>
2727
</div>
2828
<div style="float: right;">
29-
<form method="POST" action="{% url 'batch_allow_start' %}">
29+
<form method="POST" action="{% url 'batch_allow_start' pk=batch.pk %}">
3030
{% if is_autoconfirmed and not is_blocked %}
3131
{% csrf_token %}
3232
<input type="submit" value="{% translate 'Save and run batch' context 'preview-batch-save-and-run-batch' %}">
@@ -51,7 +51,7 @@ <h2> {% translate 'Batch Preview' context 'preview-batch-batch-preview' %} <img
5151
{% include 'batch_summary.html' with batch=batch done_count=0 done_percentage=0 finish_percentage=0 done_to_finish_percentage=0 status="Preview" show_block_on_errors_notice=batch.block_on_errors %}
5252
</div>
5353
<h4>{% translate 'Commands' context 'preview-batch-commands' %}</h4>
54-
<div class="overflow-auto" id="batchCommandsDiv" hx-get="{% url 'preview_batch_commands' %}" hx-trigger="load, reload" hx-indicator="#spinner" hx-swap="innerHTML">
54+
<div class="overflow-auto" id="batchCommandsDiv" hx-get="{% url 'preview_batch_commands' pk=batch.pk %}" hx-trigger="load, reload" hx-indicator="#spinner" hx-swap="innerHTML">
5555
{% translate 'Loading commands...' context 'preview-batch-loading-commands' %}
5656
</div>
5757
{% endblock %}

src/web/tests/test_views.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ def test_create_v1_batch_logged_user(self, mocker):
240240
response = self.client.get(response.url)
241241
self.assertEqual(response.status_code, 200)
242242

243-
response = self.client.post("/batch/new/preview/allow_start/")
243+
pk = Batch.objects.last().pk
244+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
244245
self.assertEqual(response.status_code, 302)
245246

246247
response = self.client.get(response.url)
@@ -270,7 +271,8 @@ def test_create_empty_name(self, mocker):
270271
self.assertEqual(response.status_code, 302)
271272
response = self.client.get(response.url)
272273
self.assertEqual(response.status_code, 200)
273-
response = self.client.post("/batch/new/preview/allow_start/")
274+
pk = Batch.objects.last().pk
275+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
274276
self.assertEqual(response.status_code, 302)
275277
response = self.client.get(response.url)
276278
self.assertTemplateUsed("batch.html")
@@ -364,7 +366,8 @@ def test_create_csv_batch_logged_user(self, mocker):
364366
response = self.client.get(response.url)
365367
self.assertEqual(response.status_code, 200)
366368

367-
response = self.client.post("/batch/new/preview/allow_start/")
369+
pk = Batch.objects.last().pk
370+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
368371
self.assertEqual(response.status_code, 302)
369372

370373
response = self.client.get(response.url)
@@ -434,7 +437,8 @@ def test_create_csv_batch_with_file(self, mocker):
434437
response = self.client.get(response.url)
435438
self.assertEqual(response.status_code, 200)
436439

437-
response = self.client.post("/batch/new/preview/allow_start/")
440+
pk = Batch.objects.last().pk
441+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
438442
self.assertEqual(response.status_code, 302)
439443

440444
response = self.client.get(response.url)
@@ -484,7 +488,8 @@ def test_create_v1_batch_with_file(self, mocker):
484488
response = self.client.get(response.url)
485489
self.assertEqual(response.status_code, 200)
486490

487-
response = self.client.post("/batch/new/preview/allow_start/")
491+
pk = Batch.objects.last().pk
492+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
488493
self.assertEqual(response.status_code, 302)
489494

490495
response = self.client.get(response.url)
@@ -608,15 +613,20 @@ def test_allow_start_after_create(self, mocker):
608613
},
609614
)
610615
self.assertEqual(response.status_code, 302)
611-
self.assertEqual(response.url, "/batch/new/preview/")
616+
pk = Batch.objects.last().pk
617+
self.assertEqual(response.url, f"/batch/new/preview/{pk}/")
618+
619+
response = self.client.get("/batch/new/preview/")
620+
self.assertEqual(response.status_code, 302)
621+
self.assertEqual(response.url, f"/batch/new/preview/{pk}/")
612622

613623
response = self.client.get(response.url)
614624
self.assertEqual(response.status_code, 200)
615625
self.assertTemplateUsed("preview_batch.html")
616626

617-
response = self.client.get("/batch/new/preview/allow_start/")
627+
response = self.client.get(f"/batch/new/preview/{pk}/allow_start/")
618628
self.assertEqual(response.status_code, 405)
619-
response = self.client.post("/batch/new/preview/allow_start/")
629+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
620630
self.assertEqual(response.status_code, 302)
621631

622632
response = self.client.get(response.url)
@@ -724,7 +734,8 @@ def test_batch_does_not_call_autoconfirmed_if_not_in_preview(self, mocker):
724734
url = res.url
725735
res = self.client.get(url)
726736
self.assertEqual(res.context["is_autoconfirmed"], True)
727-
response = self.client.post("/batch/new/preview/allow_start/")
737+
pk = Batch.objects.last().pk
738+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
728739
batch_url = response.url
729740
response = self.client.get(batch_url)
730741
batch = response.context["batch"]
@@ -810,7 +821,8 @@ def test_restart_after_stopped_buttons(self, mocker):
810821
response = self.client.get(response.url)
811822
self.assertInRes("Save and run batch", response)
812823

813-
response = self.client.post("/batch/new/preview/allow_start/")
824+
pk = Batch.objects.last().pk
825+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
814826
response = self.client.get(response.url)
815827
self.assertInRes("Stop execution", response)
816828

@@ -927,7 +939,8 @@ def test_batch_preview_commands(self, mocker):
927939
res = self.client.get(res.url)
928940
self.assertEqual(res.status_code, 200)
929941
self.assertInRes("Save and run batch", res)
930-
res = self.client.get("/batch/new/preview/commands/")
942+
pk = Batch.objects.last().pk
943+
res = self.client.get(f"/batch/new/preview/{pk}/commands/")
931944
self.assertEqual(res.status_code, 200)
932945

933946
@requests_mock.Mocker()
@@ -1009,11 +1022,12 @@ def test_batch_summary(self, mocker):
10091022
""",
10101023
},
10111024
)
1012-
response = self.client.get("/batch/new/preview/")
1025+
pk = Batch.objects.last().pk
1026+
response = self.client.get(f"/batch/new/preview/{pk}/")
10131027
self.assertEqual(response.status_code, 200)
10141028
self.assertTemplateUsed("preview_batch.html")
10151029
self.assertInRes("linear-gradient(to right, green 0%, #C52F21 0)", response)
1016-
response = self.client.post("/batch/new/preview/allow_start/")
1030+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
10171031
self.assertEqual(response.status_code, 302)
10181032
response = self.client.get(response.url)
10191033
self.assertEqual(response.status_code, 200)
@@ -1175,7 +1189,8 @@ def test_batch_stop_permissions(self, mocker):
11751189
response = self.client.get(response.url)
11761190
self.assertInRes("Save and run batch", response)
11771191

1178-
response = self.client.post("/batch/new/preview/allow_start/")
1192+
pk = Batch.objects.last().pk
1193+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
11791194
response = self.client.get(response.url)
11801195
self.assertInRes("Stop execution", response)
11811196

@@ -1249,7 +1264,8 @@ def test_batch_restart_permissions(self, mocker):
12491264
response = self.client.get(response.url)
12501265
self.assertInRes("Save and run batch", response)
12511266

1252-
response = self.client.post("/batch/new/preview/allow_start/")
1267+
pk = Batch.objects.last().pk
1268+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
12531269
response = self.client.get(response.url)
12541270
self.assertInRes("Stop execution", response)
12551271

@@ -1334,7 +1350,8 @@ def test_batch_rerun_permissions(self, mocker):
13341350
)
13351351
self.assertEqual(response.status_code, 302)
13361352

1337-
response = self.client.post("/batch/new/preview/allow_start/")
1353+
pk = Batch.objects.last().pk
1354+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
13381355
response = self.client.get(response.url)
13391356
self.assertInRes("Stop execution", response)
13401357

@@ -1421,7 +1438,8 @@ def test_batch_report_permissions(self, mocker):
14211438
)
14221439
self.assertEqual(response.status_code, 302)
14231440

1424-
response = self.client.post("/batch/new/preview/allow_start/")
1441+
pk = Batch.objects.last().pk
1442+
response = self.client.post(f"/batch/new/preview/{pk}/allow_start/")
14251443
response = self.client.get(response.url)
14261444
self.assertInRes("Stop execution", response)
14271445

src/web/urls.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616
from .views.batches import last_batches
1717
from .views.batches import last_batches_by_user
1818
from .views.batches import last_batches_table
19-
from .views.new_batch import batch_allow_start
2019
from .views.new_batch import new_batch
20+
from .views.new_batch import redirect_to_preview_last_batch
2121
from .views.new_batch import preview_batch
2222
from .views.new_batch import preview_batch_commands
23+
from .views.new_batch import batch_allow_start
2324
from .views.profile import profile
2425
from .views.profile import language_change
2526
from .views.statistics import statistics
@@ -50,13 +51,14 @@
5051
path("batch/<int:pk>/summary/", batch_summary, name="batch_summary"),
5152
path("batch/<int:pk>/commands/", batch_commands, name="batch_commands"),
5253
path("batch/new/", new_batch, name="new_batch"),
53-
path("batch/new/preview/", preview_batch, name="preview_batch"),
54+
path("batch/new/preview/", redirect_to_preview_last_batch, name="redirect_to_preview_last_batch"),
55+
path("batch/new/preview/<int:pk>/", preview_batch, name="preview_batch"),
5456
path(
55-
"batch/new/preview/commands/",
57+
"batch/new/preview/<int:pk>/commands/",
5658
preview_batch_commands,
5759
name="preview_batch_commands",
5860
),
59-
path("batch/new/preview/allow_start/", batch_allow_start, name="batch_allow_start"),
61+
path("batch/new/preview/<int:pk>/allow_start/", batch_allow_start, name="batch_allow_start"),
6062
path("statistics/", statistics, name="statistics"),
6163
path("statistics/counters/", all_time_counters, name="statistics_all_time_counters"),
6264
path("statistics/plots/", plots, name="statistics_plots"),

0 commit comments

Comments
 (0)