Skip to content
Snippets Groups Projects
Commit d767a649 authored by Tomáš Valenta's avatar Tomáš Valenta
Browse files

finish basic redmine implementation

parent ff4cd789
No related branches found
No related tags found
2 merge requests!787Release,!743Add Redmine datasets to charts, Instagram feed to homepage
Pipeline #12118 passed
...@@ -3,4 +3,4 @@ ...@@ -3,4 +3,4 @@
line_length = 88 line_length = 88
multi_line_output = 3 multi_line_output = 3
include_trailing_comma = true include_trailing_comma = true
known_third_party = PyPDF2,arrow,bleach,bs4,captcha,celery,dateutil,django,environ,faker,fastjsonschema,icalevnt,markdown,modelcluster,pirates,pytest,pytz,requests,sentry_sdk,taggit,tweepy,wagtail,wagtailmetadata,weasyprint,yaml known_third_party = PyPDF2,arrow,bleach,bs4,captcha,celery,dateutil,django,environ,faker,fastjsonschema,icalevnt,markdown,modelcluster,pirates,pytest,pytz,requests,requests_cache,sentry_sdk,taggit,tweepy,wagtail,wagtailmetadata,weasyprint,yaml
This diff is collapsed.
...@@ -491,7 +491,7 @@ class MainArticlesPage( ...@@ -491,7 +491,7 @@ class MainArticlesPage(
def get_all_articles_search_response(self, request): def get_all_articles_search_response(self, request):
article_paginator = Paginator( article_paginator = Paginator(
MainArticlePage.objects.order_by("-date").live().search(request.GET["q"]), MainArticlePage.objects.live().search(request.GET["q"]).order_by("-date"),
10, 10,
) )
article_page = article_paginator.get_page(request.GET.get("page", 1)) article_page = article_paginator.get_page(request.GET.get("page", 1))
...@@ -515,7 +515,7 @@ class MainArticlesPage( ...@@ -515,7 +515,7 @@ class MainArticlesPage(
query = request.GET["q"] query = request.GET["q"]
article_results = ( article_results = (
MainArticlePage.objects.order_by("-date").live().search(query)[:11] MainArticlePage.objects.live().search(query).order_by("-date")[:11]
) )
return render( return render(
......
...@@ -2,9 +2,11 @@ import datetime ...@@ -2,9 +2,11 @@ import datetime
import json import json
import logging import logging
import re import re
import typing
import urllib import urllib
import requests_cache import requests_cache
from django.core.exceptions import ValidationError
from django.core.files.images import ImageFile from django.core.files.images import ImageFile
from django.forms.utils import ErrorList from django.forms.utils import ErrorList
from wagtail import blocks from wagtail import blocks
...@@ -703,14 +705,8 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -703,14 +705,8 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
required=False, required=False,
) )
created_on_min_date = blocks.DateBlock( created_on_min_date = blocks.DateBlock(label="Min. datum vytvoření", required=True)
label="Min. datum vytvoření", created_on_max_date = blocks.DateBlock(label="Max. datum vytvoření", required=True)
required=True
)
created_on_max_date = blocks.DateBlock(
label="Max. datum vytvoření",
required=True
)
updated_on = blocks.CharBlock( updated_on = blocks.CharBlock(
label="Filtr pro datum aktualizace", label="Filtr pro datum aktualizace",
max_length=128, max_length=128,
...@@ -734,15 +730,20 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -734,15 +730,20 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
required=False, required=False,
) )
def _get_issues_url(self, value, project_id): def _get_issues_url(self, value, project_id: typing.Union[None, str] = None):
url = "https://redmine.pirati.cz/issues.json" url = "https://redmine.pirati.cz/issues.json"
params = [ params = [
("sort", "created_on"), ("sort", "created_on"),
("limit", "100"), ("limit", "100"),
("created_on", f"><{value['created_on_min_date']}|{value['created_on_max_date']}"), (
("project_id", project_id) "created_on",
f"><{value['created_on_min_date']}|{value['created_on_max_date']}",
),
] ]
if project_id is not None:
params.append(("project_id", project_id))
is_open = value.get("is_open", False) is_open = value.get("is_open", False)
is_closed = value.get("is_closed", False) is_closed = value.get("is_closed", False)
...@@ -792,16 +793,18 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -792,16 +793,18 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
collected_issues += issues_response["issues"] collected_issues += issues_response["issues"]
data = [0] * len(labels)
ending_position = len(collected_issues) - 1 ending_position = len(collected_issues) - 1
data = None
current_issue_count = 0 current_issue_count = 0
current_label = datetime.date.fromisoformat( current_label = datetime.date.fromisoformat(
collected_issues[0]["created_on"].split("T")[0] collected_issues[0]["created_on"].split("T")[0]
) )
if not only_grow: if not only_grow:
data = [0] * len(labels)
for position, issue in enumerate( for position, issue in enumerate(
collected_issues collected_issues
): # Assume correct sorting order ): # Assume correct sorting order
...@@ -823,6 +826,7 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -823,6 +826,7 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
current_issue_count += 1 current_issue_count += 1
else: else:
data = []
issue_count_by_date = {} issue_count_by_date = {}
for position, issue in enumerate( for position, issue in enumerate(
...@@ -836,7 +840,9 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -836,7 +840,9 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
issue_count_by_date[current_label] = 0 issue_count_by_date[current_label] = 0
if current_label != created_on_date or position == ending_position: if current_label != created_on_date or position == ending_position:
issue_count_by_date[current_label] = current_issue_count # Assume labels are unique issue_count_by_date[
current_label
] = current_issue_count # Assume labels are unique
current_label = created_on_date current_label = created_on_date
if position == ending_position: if position == ending_position:
...@@ -845,7 +851,6 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -845,7 +851,6 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
current_issue_count += 1 current_issue_count += 1
print(issue_count_by_date)
previous_date = None previous_date = None
for date in labels: for date in labels:
...@@ -867,27 +872,37 @@ class ChartRedmineIssueDataset(blocks.StructBlock): ...@@ -867,27 +872,37 @@ class ChartRedmineIssueDataset(blocks.StructBlock):
labels = [] labels = []
if value.get("split_per_project", False):
for day_count in range( for day_count in range(
( (value["created_on_max_date"] - value["created_on_min_date"]).days + 1
value["created_on_max_date"]
- value["created_on_min_date"]
).days
+ 1
): ):
day = value["created_on_min_date"] + datetime.timedelta(days=day_count) day = value["created_on_min_date"] + datetime.timedelta(days=day_count)
labels.append(day) labels.append(day)
datasets = [] datasets = []
project_choices_lookup = dict(get_redmine_projects())
for project_id in value["projects"]: for project_id in value["projects"]:
issues_url = self._get_issues_url(value, project_id) issues_url = self._get_issues_url(value, project_id)
datasets.append({ datasets.append(
"label": project_id, {
"data": self._get_parsed_issues(value, labels, issues_url) "label": f"{value['issue_label']} - {project_choices_lookup[int(project_id)]}",
}) "data": self._get_parsed_issues(value, labels, issues_url),
}
)
labels = [date.strftime("%d. %m. %Y") for date in labels] labels = [date.strftime("%d. %m. %Y") for date in labels]
else:
issues_url = self._get_issues_url(value)
datasets.append(
{
"label": value["issue_label"],
"data": self._get_parsed_issues(value, labels, issues_url),
}
)
context["parsed_issue_labels"] = labels context["parsed_issue_labels"] = labels
context["parsed_issues"] = datasets context["parsed_issues"] = datasets
...@@ -925,7 +940,7 @@ class ChartBlock(blocks.StructBlock): ...@@ -925,7 +940,7 @@ class ChartBlock(blocks.StructBlock):
hide_points = blocks.BooleanBlock( hide_points = blocks.BooleanBlock(
label="Schovat body", label="Schovat body",
required=False, required=False,
help_text="Pouze u linových grafů.", help_text="Mění vzhled pouze u linových grafů.",
) )
local_labels = blocks.ListBlock( local_labels = blocks.ListBlock(
...@@ -954,8 +969,37 @@ class ChartBlock(blocks.StructBlock): ...@@ -954,8 +969,37 @@ class ChartBlock(blocks.StructBlock):
blank=True, blank=True,
required=False, required=False,
label="Zdroje dat z Redmine (úkoly)", label="Zdroje dat z Redmine (úkoly)",
help_text=(
"Úkoly, podle doby vytvoření. Pokud definuješ "
"více zdrojů, datumy v nich musí být stejné."
),
)
def clean(self, value):
result = super().clean(value)
redmine_issues_exist = len(value.get("redmine_issue_datasets", [])) != 0
if len(value.get("local_datasets", [])) != 0 and redmine_issues_exist:
raise ValidationError(
"Definuj pouze jeden typ zdroje dat - místní, nebo z Redmine."
) )
if redmine_issues_exist:
min_date = value["redmine_issue_datasets"][0]["created_on_min_date"]
max_date = value["redmine_issue_datasets"][0]["created_on_max_date"]
for dataset in value["redmine_issue_datasets"][1:]:
if (
dataset["created_on_min_date"] != min_date
or dataset["created_on_max_date"] != max_date
):
raise ValidationError(
"Maximální a minimální data všech zdrojů z Redmine musí být stejné"
)
return result
def get_context(self, value, parent_context=None): def get_context(self, value, parent_context=None):
context = super().get_context(value, parent_context=parent_context) context = super().get_context(value, parent_context=parent_context)
...@@ -974,9 +1018,11 @@ class ChartBlock(blocks.StructBlock): ...@@ -974,9 +1018,11 @@ class ChartBlock(blocks.StructBlock):
) )
elif len(value["redmine_issue_datasets"]) != 0: elif len(value["redmine_issue_datasets"]) != 0:
for dataset_wrapper in value["redmine_issue_datasets"]: for dataset_wrapper in value["redmine_issue_datasets"]:
redmine_context = ChartRedmineIssueDataset().get_context(dataset_wrapper) redmine_context = ChartRedmineIssueDataset().get_context(
dataset_wrapper
)
labels += redmine_context["parsed_issue_labels"] labels = redmine_context["parsed_issue_labels"]
datasets += redmine_context["parsed_issues"] datasets += redmine_context["parsed_issues"]
value["datasets"] = json.dumps(datasets) value["datasets"] = json.dumps(datasets)
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment