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

wip - redmine sync

parent d2207489
No related branches found
No related tags found
2 merge requests!787Release,!743Add Redmine datasets to charts, Instagram feed to homepage
Pipeline #12089 passed
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import json
import logging
import re
import requests
import urllib
from django.core.files.images import ImageFile
......@@ -674,6 +675,127 @@ class ChartDataset(blocks.StructBlock):
label = "Zdroj dat"
def get_redmine_projects():
projects = requests.get("https://redmine.pirati.cz/projects.json?limit=10000")
projects.raise_for_status()
projects = projects.json()["projects"]
return [
(project["id"], project["name"])
for project in projects
]
class ChartRedmineIssueDataset(blocks.StructBlock):
projects = blocks.MultipleChoiceBlock(
label="Projekty",
choices=get_redmine_projects
)
is_open = blocks.BooleanBlock(
label="Jen otevřené",
required=False,
)
is_closed = blocks.BooleanBlock(
label="Jen uzavřené",
required=False,
)
created_on = blocks.CharBlock(
label="Filtr pro datum vytvoření",
max_length=128,
help_text="Např. >=2022-01-01",
required=False,
)
updated_on = blocks.CharBlock(
label="Filtr pro datum aktualizace",
max_length=128,
help_text="Např. <=2023-01-01",
required=False,
)
limit = blocks.IntegerBlock(
label="Limit výsledků",
help_text="Např. 10 pro omezení na 10 prvních výsledků",
required=False,
)
offset = blocks.IntegerBlock(
label="Odsazení výsledků od začátku",
help_text="Např. 50 pro přeskočení prvních 50 výsledků",
required=False,
)
def _get_issues_url(self, value):
url = "https://redmine.pirati.cz/issues.json"
params = [("sort", "start_date")]
if value["is_open"] and value["is_closed"]:
params.append(("status_id", "*"))
elif value["is_open"]:
params.append(("status_id", "open"))
elif value["is_closed"]:
params.append(("status_id", "closed"))
for string_filter in ("created_on", "updated_on", "sort"):
if value[string_filter] is not None:
params.append((string_filter, value[string_filter]))
params.append(
("offset", str(
value["offset"]
if value["offset"] is not None
else 100000
))
)
if value["offset"] is not None:
params.append(("offset", str(value["offset"])))
is_first = True
for param_set in params:
param, param_value = param_set
url += "?" if is_first else "&"
url += f"{param}={urllib.parse.quote(param_value)}"
is_first = False
return url
def _get_parsed_issues(self, value, issues_url):
issues_response = requests.get(requests_url)
issues_response.raise_for_status()
issues_response = issues_response.json()
issues_dataset = {}
current_label = ""
for issue in issues_response: # Assume correct order
if current_label != issue["start_date"]:
current_label = issue["start_date"]
if current_label not in issues_dataset:
issues_dataset[issues_dataset] = 0
issues_dataset[issues_dataset] += 1
return issues_dataset
def get_context(self, value) -> list:
context = super().get_context(value)
issues_url = self._get_issues_url(value)
context["parsed_issues"] = self._get_parsed_issues(value, issues_url)
return context
class Meta:
label = "Zdroj dat z Redmine (úkoly)"
class ChartBlock(blocks.StructBlock):
title = blocks.CharBlock(
label="Název",
......@@ -692,32 +814,60 @@ class ChartBlock(blocks.StructBlock):
],
default="bar",
)
labels = blocks.ListBlock(
local_labels = blocks.ListBlock(
blocks.CharBlock(
max_length=40,
label="Skupina",
),
label="Skupiny",
default=[],
blank=True,
required=False,
collapsed=True,
label="Místně definované skupiny",
)
datasets = blocks.ListBlock(
local_datasets = blocks.ListBlock(
ChartDataset(),
label="Zdroje dat",
default=[],
blank=True,
required=False,
collapsed=True,
label="Místní zdroje dat",
)
redmine_issue_datasets = blocks.ListBlock(
ChartRedmineIssueDataset(label="Redmine úkoly"),
default=[],
blank=True,
required=False,
collapsed=True,
label="Zdroje dat z Redmine (úkoly)"
)
def get_context(self, value, parent_context=None):
context = super().get_context(value, parent_context=parent_context)
datasets = []
labels = []
if len(value["local_datasets"]) != 0:
labels = value["local_labels"]
for dataset in value["datasets"]:
for dataset in value["local_datasets"]:
dataset = dict(dataset)
datasets.append(
{"label": dataset["label"], "data": [item for item in dataset["data"]]}
)
elif len(value["redmine_issue_datasets"]) != 0:
for dataset_wrapper in value["redmine_issue_datasets"]:
print(dataset_wrapper, dir(dataset_wrapper))
for label, dataset in dataset_wrapper.value["parsed_issues"].items():
labels.append(label)
datasets.append(dataset)
value["datasets"] = json.dumps(datasets)
value["labels"] = json.dumps([label for label in value["labels"]])
value["labels"] = json.dumps([label for label in labels])
return context
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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