Merge "Update TestRail reporter to not skip failed Setup and TearDown classes"
diff --git a/testrail_bot/control/celery_tasks/filters.py b/testrail_bot/control/celery_tasks/filters.py
index e19b5d5..4407eed 100644
--- a/testrail_bot/control/celery_tasks/filters.py
+++ b/testrail_bot/control/celery_tasks/filters.py
@@ -13,4 +13,6 @@
def last_traceback_filter(data: str) -> str:
+ if data.rfind("Traceback") < 0:
+ return data
return data[data.rfind("Traceback"):]
diff --git a/testrail_bot/control/celery_tasks/tasks.py b/testrail_bot/control/celery_tasks/tasks.py
index d378827..38bf022 100644
--- a/testrail_bot/control/celery_tasks/tasks.py
+++ b/testrail_bot/control/celery_tasks/tasks.py
@@ -40,7 +40,7 @@
@shared_task
-def check_today_testplan():
+def check_today_testplan(*args, **kwargs):
"""
Finds today testplan
Creates TestRun with this id
@@ -49,3 +49,15 @@
:return:
"""
schedules_pipeline.task_to_check_today_testplan()
+
+
+@shared_task
+def check_specific_testplan(testplan_id, *args, **kwargs):
+ """
+ Finds today testplan
+ Creates TestRun with this id
+ Creates Periodic task to analyze created TestRun
+
+ :return:
+ """
+ schedules_pipeline.task_to_check_testplan(testplan_id)
diff --git a/testrail_bot/control/forms.py b/testrail_bot/control/forms.py
index fc27349..363035b 100644
--- a/testrail_bot/control/forms.py
+++ b/testrail_bot/control/forms.py
@@ -64,4 +64,4 @@
class PeriodicTaskForm(forms.ModelForm):
class Meta:
model = CronPeriodicTask
- fields = ["id", "enabled", "name", "cron"]
+ fields = ["id", "enabled", "name", "cron", "task_name", "testplan_id_arg"]
diff --git a/testrail_bot/control/migrations/0011_cronperiodictask_task_name_and_more.py b/testrail_bot/control/migrations/0011_cronperiodictask_task_name_and_more.py
new file mode 100644
index 0000000..2901309
--- /dev/null
+++ b/testrail_bot/control/migrations/0011_cronperiodictask_task_name_and_more.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.2.7 on 2024-03-18 19:56
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('control', '0010_alter_testrailtestrun_options'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='cronperiodictask',
+ name='task_name',
+ field=models.CharField(choices=[('control.celery_tasks.tasks.check_today_testplan', 'Check today testplan'), ('control.celery_tasks.tasks.check_specific_testplan', 'Check specific testplan')], default='control.celery_tasks.tasks.check_today_testplan', max_length=300),
+ ),
+ migrations.AddField(
+ model_name='cronperiodictask',
+ name='testplan_id_arg',
+ field=models.CharField(blank=True, max_length=30, null=True),
+ ),
+ ]
diff --git a/testrail_bot/control/models.py b/testrail_bot/control/models.py
index 2994890..02ff78b 100644
--- a/testrail_bot/control/models.py
+++ b/testrail_bot/control/models.py
@@ -131,22 +131,27 @@
auto_now=True)
-TASK_CHOICES = [
+TASKS = [
("control.celery_tasks.tasks.check_today_testplan",
"Check today testplan",
[]
),
- ("control.celery_tasks.tasks.task_to_check_testplan",
- "Check testplan",
- ["testplan_id"]
+ ("control.celery_tasks.tasks.check_specific_testplan",
+ "Check specific testplan",
+ ["testplan_id_arg"]
),
]
+TASK_CHOICES = list(map(lambda x: x[:-1], TASKS))
+
class CronPeriodicTask(PeriodicTask):
cron = models.CharField(default="",
max_length=300,
blank=False)
+ task_name = models.CharField(max_length=300, choices=TASK_CHOICES,
+ default=TASK_CHOICES[0][0])
+ testplan_id_arg = models.CharField(max_length=30, blank=True, null=True)
class Meta:
ordering = ["id"]
diff --git a/testrail_bot/control/templates/control/scheduler.html b/testrail_bot/control/templates/control/scheduler.html
index 6a33562..928fd58 100644
--- a/testrail_bot/control/templates/control/scheduler.html
+++ b/testrail_bot/control/templates/control/scheduler.html
@@ -4,14 +4,14 @@
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
- $("#task-select").change(function(){
+ $("#id_task_name").change(function(){
$("div#kwargs").empty()
- var t = $("#task-select").val();
- {% for task, text, args in TASK_CHOICES %}
+ var t = $("#id_task_name").val();
+ {% for task, text, args in TASKS %}
{% if args %}
if (t == '{{ task }}') {
{% for arg in args %}
- $("div#kwargs").append("<input type='text' name='{{ arg }}'>");
+ $("div#kwargs").append("<input type='text' placeholder='Enter {{ arg }}' name='{{ arg }}'>");
{% endfor %}
}
{% endif %}
@@ -62,12 +62,27 @@
{% bootstrap_field form.name size='sm' %}</div>
<div class="col-xs-8">
{% bootstrap_field form.cron size='sm' %}</div>
+ <div class="col-xs-8">
+ {% bootstrap_field form.task_name size='sm' %}</div>
- <select name="task" id="task-select">
- <option value="control.celery_tasks.tasks.check_today_testplan">
- Check today testplan</option>
- </select>
- <div id="kwargs"></div>
+
+
+<!-- <select name="task_name" id="task-select">-->
+<!-- <option value="control.celery_tasks.tasks.check_today_testplan">-->
+<!-- Check today testplan</option>-->
+<!-- </select>-->
+ <div id="kwargs">
+ {% if pk %}
+ {% for task, text, args in TASKS %}
+ {% if 'testplan_id_arg' in args %}
+ <div class="col-xs-8">
+ {% bootstrap_field form.testplan_id_arg size='sm' %}</div>
+ {% endif %}
+ {% endfor %}
+
+ {% endif %}
+
+ </div>
</form>
</div>
{% endblock %}
diff --git a/testrail_bot/control/views.py b/testrail_bot/control/views.py
index 8d5f692..e6655ad 100644
--- a/testrail_bot/control/views.py
+++ b/testrail_bot/control/views.py
@@ -265,12 +265,13 @@
{
"form": form,
"pk": pk,
- "TASK_CHOICES": models.TASK_CHOICES
+ "TASKS": models.TASKS
}
)
def save_scheduler(request, pk=None):
+ print(f"{request.POST=}")
minute, hour, day_of_month, month_of_year, day_of_week = \
request.POST.get("cron", "* * * * *").split(" ")
if pk is None:
@@ -285,15 +286,18 @@
crontab=sch,
cron=request.POST.get("cron"),
name=request.POST.get("name"),
- task="control.celery_tasks.tasks.check_today_testplan",
+ task_name=request.POST.get("task_name"),
enabled=request.POST.get("enabled") == 'on',
- # TODO(harhipova): uncomment when implemented tasks with arguments
- # args=args,
- # kwargs=kwargs,
+ testplan_id_arg=request.POST.get("testplan_id_arg"),
)
else:
task = models.CronPeriodicTask.objects.get(pk=pk)
+
+ task.task = request.POST.get("task_name")
+ task.args = json.dumps((request.POST.get("testplan_id_arg"),))
+
form = forms.PeriodicTaskForm(request.POST, instance=task)
+
CrontabSchedule.objects.filter(id=task.crontab.id).update(
minute=minute,
hour=hour,
@@ -301,6 +305,9 @@
month_of_year=month_of_year,
day_of_week=day_of_week
)
+ if not form.is_valid():
+ print(f"{form.errors=}")
+ return
form.save()
PeriodicTasks.update_changed()
return render(
@@ -308,7 +315,7 @@
{
"form": form,
"pk": task.id,
- "TASK_CHOICES": models.TASK_CHOICES
+ "TASKS": models.TASKS
}
)