Skip to content

Commit

Permalink
checkin
Browse files Browse the repository at this point in the history
  • Loading branch information
jctanner committed Jun 19, 2023
1 parent 0c05990 commit 6f5e8b7
Show file tree
Hide file tree
Showing 8 changed files with 339 additions and 65 deletions.
34 changes: 34 additions & 0 deletions lib/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
PROJECTS = [
'AA',
'AAH',
'ANSTRAT',
'AAPRFE',
'AAP',
'ACA',
'AAPBUILD',
'PARTNERENG',
'PLMCORE',
]

ISSUE_COLUMN_NAMES = [
"datafile",
"fetched",
"url",
"id",
"project",
"number",
"key",
"type",
"summary",
"description",
"created_by",
"assigned_to",
"created",
"updated",
"closed",
"state",
"priority",
"data",
"history"
]

4 changes: 3 additions & 1 deletion lib/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
fetched TIMESTAMP,
created TIMESTAMP,
updated TIMESTAMP,
closed TIMESTAMP,
state VARCHAR(50),
priority VARCHAR(50),
data JSONB,
Expand Down Expand Up @@ -60,13 +61,14 @@
assigned_to,
created,
updated,
closed,
state,
priority,
data,
history
)
VALUES (
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
);
"""

Expand Down
17 changes: 17 additions & 0 deletions lib/flaskapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
# from nodes import TicketNode
from nodes import tickets_to_nodes
from database import JiraDatabaseWrapper
from stats_wrapper import StatsWrapper

jdbw = JiraDatabaseWrapper()
conn = jdbw.get_connection()
Expand Down Expand Up @@ -200,5 +201,21 @@ def tickets_tree():
return jsonify(imap)


@app.route('/api/tickets_burndown')
@app.route('/api/tickets_burndown/')
def tickets_burndown():
sw = StatsWrapper()
#data = sw.burndown('AAH', frequency='monthly')
data = sw.burndown('AAH', frequency='weekly')
data = json.loads(data)
keys = list(data.keys())
keymap = [(x, x.split('T')[0]) for x in keys]
for km in keymap:
data[km[1]] = data[km[0]]
data.pop(km[0], None)
return jsonify(data)



if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
72 changes: 15 additions & 57 deletions lib/jira_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,35 +27,20 @@
from pprint import pprint
from logzero import logger

from constants import PROJECTS, ISSUE_COLUMN_NAMES
from database import JiraDatabaseWrapper
from database import ISSUE_INSERT_QUERY
from utils import (
sortable_key_from_ikey,
history_items_to_dict,
history_to_dict,
)


rlog = logging.getLogger('urllib3')
rlog.setLevel(logging.DEBUG)


ISSUE_COLUMN_NAMES = [
"datafile",
"fetched",
"url",
"id",
"project",
"number",
"key",
"type",
"summary",
"description",
"created_by",
"assigned_to",
"created",
"updated",
"state",
"priority",
"data",
"history"
]

class HistoryFetchFailedException(Exception):
def __init__(self, message="Failed to fetch history data."):
self.message = message
Expand Down Expand Up @@ -136,6 +121,14 @@ def created(self):
def updated(self):
return self._data['fields']['updated']

@property
def closed(self):

if not self.state == 'Closed':
return None

return self._data['fields']['resolutiondate']

@property
def state(self):
return self._data['fields']['status']['name']
Expand All @@ -147,29 +140,6 @@ def priority(self):
return self._data['fields']['priority']['name']


def sortable_key_from_ikey(key):
return (key.split('-')[0], int(key.split('-')[-1]), key)


def history_items_to_dict(items):
data = []
for item in items:
data.append(item.__dict__)
return data


def history_to_dict(history):
return {
'id': history.id,
'author': {
'displayName': history.author.displayName,
'key': history.author.key,
'name': history.author.name
},
'items': history_items_to_dict(history.items)
}


class JiraWrapper:

processed = None
Expand Down Expand Up @@ -651,25 +621,13 @@ def start_scrape(project):

def main():

projects = [
'AA',
'AAH',
'ANSTRAT',
'AAPRFE',
'AAP',
'ACA',
'AAPBUILD',
'PARTNERENG',
'PLMCORE',
]

parser = argparse.ArgumentParser()
parser.add_argument('--serial', action='store_true', help='do not use threading')
parser.add_argument('--project', help='which project to scrape')
parser.add_argument('--number', help='which number scrape', type=int, default=None)

args = parser.parse_args()

projects = PROJECTS[:]
if args.project:
projects = [args.project]

Expand Down
118 changes: 118 additions & 0 deletions lib/static/js/burndown.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
// Define a custom date adapter
//class CustomDateAdapter extends Chart._adapters._date.adapters._date {
class CustomDateAdapter extends Chart._adapters._date {
constructor(options) {
super(options);
}

format(timestamp, format) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');

return `${year}-${month}-${day}`;
}

parse(timestamp) {
const [year, month, day] = timestamp.split('-').map(Number);

return new Date(year, month - 1, day);
}

add(timestamp, amount, unit) {
const date = new Date(timestamp);
const adjustedDate = new Date(date.getTime());

switch (unit) {
case 'day':
adjustedDate.setDate(date.getDate() + amount);
break;
// Add support for other units if needed
}

return adjustedDate;
}

diff(a, b, unit) {
const diff = a.getTime() - b.getTime();

switch (unit) {
case 'day':
return Math.round(diff / (24 * 60 * 60 * 1000));
// Add support for other units if needed
}

return null;
}
}

// Register the custom date adapter
//Chart.register(CustomDateAdapter);

function onLoad() {

document.getElementById('burndown-chart').innerHTML = '<div class="spinner"></div>';

fetch("/api/tickets_burndown", {
method: "GET",
headers: {'Content-Type': 'application/json'},
}).then(res => res.json()).then(res => {
console.log("Request complete! response:", res, typeof res);

let newHTML = "";
newHTML += '<h1>BURNDOWN</h1>';
document.getElementById('burndown-chart').innerHTML = newHTML;

const labels = Object.keys(res);
console.log(labels);
const values = Object.values(res);
console.log(values);
const ctx = document.getElementById('lineChart').getContext('2d');

/*
const lineChart = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
label: 'Data',
data: values,
fill: false,
borderColor: 'rgb(75, 192, 192)',
tension: 0.1
}]
},
options: {
responsive: true,
scales: {
x: {
type: 'time',
time: {
unit: 'month'
}
},
y: {
beginAtZero: true
}
}
}
});
*/
const lineChart = new Chart(ctx, {
type: 'line',
data: {
labels: labels,
datasets: [{
label: 'backlog count',
data: values,
fill: false,
borderColor: 'rgb(75, 192, 192)',
tension: 0.1
}]
}
});

console.log("done building burndown");
});
};
Loading

0 comments on commit 6f5e8b7

Please sign in to comment.