summaryrefslogtreecommitdiffstats
path: root/app/views.py
blob: 2e6ba6fa36ce4243c5ec865f06fbcdd6cffd7056 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from flask import jsonify, abort, make_response, request, url_for
from datetime import datetime
from app import app, db, models

def make_public_ticket(ticket):
	new_ticket = ticket.copy()
	new_ticket['uri'] = url_for('get_ticket', ticket_id=ticket['id'], _external=True)
	return new_ticket

def ticket_to_dict(ticket):
	nt = {}
	nt['id'] = ticket.id

	nt['deleted'] = ticket.deleted

	nt['summary'] = ticket.summary
	nt['body'] = ticket.body

	nt['opened_at'] = ticket.opened_at.strftime('%Y-%m-%dT%H:%M:%S')

	if ticket.updated_at:
		nt['updated_at'] = ticket.updated_at.strftime('%Y-%m-%dT%H:%M:%S')
	else:
		nt['updated_at'] = None

	nt['status'] = ticket.status

	nt['resolution'] = ticket.resolution
	nt['reason'] = ticket.reason

	if ticket.opened_by:
		nt['opened_by'] = {
			'id': ticket.opened_by.id,
			'nickname': ticket.opened_by.nickname,
			'email': ticket.opened_by.email,
		}
	else:
		nt['opened_by'] = {'id': None, 'nickname': None, 'email': None}

	if ticket.assigned_to:
		nt['assigned_to'] = {
			'id': ticket.assigned_to.id,
			'nickname': ticket.assigned_to.nickname,
			'email': ticket.assigned_to.email,
		}
	else:
		nt['assigned_to'] = None

	return nt

@app.route('/tbt/api/1.0/tickets', methods=['GET'])
def get_tickets():
	ts = models.Ticket.query.filter(models.Ticket.deleted != True).all()
	tickets = map(ticket_to_dict, ts)
	return jsonify({'tickets': list(map(make_public_ticket, tickets))})

@app.route('/tbt/api/1.0/ticket', methods=['POST'])
def create_ticket():
	if not request.json or not ('summary' and 'body' and 'user_nickname') in request.json:
		abort(400)

	user = models.User.query.filter(models.User.nickname == request.json['user_nickname']).first()

	ticket = models.Ticket(summary=request.json['summary'],
	                       body=request.json['body'],
	                       opened_by=user,
	                       opened_at=datetime.utcnow())
	db.session.add(ticket)
	db.session.commit()

	td = ticket_to_dict(ticket)

	return jsonify({'ticket': make_public_ticket(td)}), 201

@app.route('/tbt/api/1.0/ticket/<int:ticket_id>', methods=['GET'])
def get_ticket(ticket_id):
	ticket = models.Ticket.query.get(ticket_id)
	if not ticket:
		abort(404)

	return jsonify({'ticket': make_public_ticket(ticket_to_dict(ticket))})

@app.route('/tbt/api/1.0/ticket/<int:ticket_id>', methods=['PUT'])
def update_ticket(ticket_id):
	ticket = next((t for t in tickets if t['id'] == ticket_id), None)
	if not ticket:
		abort(404)
	if not request.json:
		abort(400)
	ticket['summary']     = request.json.get('summary', ticket['summary'])
	ticket['body']        = request.json.get('body', ticket['body'])
	ticket['status']      = request.json.get('status', ticket['status'])
	ticket['resolution']  = request.json.get('resolution', ticket['resolution'])
	ticket['reason']      = request.json.get('reason', ticket['reason'])
	ticket['assigned-to'] = request.json.get('assigned-to', ticket['assigned-to'])
	return jsonify({'ticket': make_public_ticket(ticket)})

@app.route('/tbt/api/1.0/ticket/<int:ticket_id>', methods=['DELETE'])
def delete_ticket(ticket_id):
	ticket = next((t for t in tickets if t['id'] == ticket_id), None)
	if not ticket:
		abort(404)
	#tickets.remove(ticket)
	ticket['deleted'] = True
	return jsonify({'result': True})

@app.errorhandler(404)
def not_found(error):
	return make_response(jsonify({'error': 'Not found'}), 404)