As the rec_name is composed of the name or the origin rec_name, it is not possible to use the order from the search. But it is still better to list the works by alphabetic order to ease the selection by keyboard in Chronos. issue6454 review39451002
131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
import datetime
|
|
|
|
from werkzeug.exceptions import abort, Response
|
|
|
|
from trytond.transaction import Transaction
|
|
from trytond.wsgi import app
|
|
from trytond.protocols.wrappers import with_pool, with_transaction, \
|
|
user_application
|
|
|
|
timesheet_application = user_application('timesheet')
|
|
|
|
|
|
@app.route('/<database_name>/timesheet/employees', methods=['GET'])
|
|
@with_pool
|
|
@with_transaction()
|
|
@timesheet_application
|
|
def timesheet_employees(request, pool):
|
|
User = pool.get('res.user')
|
|
user = User(Transaction().user)
|
|
return [{'id': e.id, 'name': e.rec_name} for e in user.employees]
|
|
|
|
|
|
@app.route('/<database_name>/timesheet/employee/<int:employee>/works',
|
|
methods=['GET'])
|
|
@with_pool
|
|
@with_transaction()
|
|
@timesheet_application
|
|
def timesheet_works(request, pool, employee):
|
|
Work = pool.get('timesheet.work')
|
|
Employee = pool.get('company.employee')
|
|
employee = Employee(employee)
|
|
with Transaction().set_context(
|
|
company=employee.company.id, employee=employee.id):
|
|
works = Work.search([
|
|
('company', '=', employee.company.id),
|
|
])
|
|
return sorted(({
|
|
'id': w.id,
|
|
'name': w.rec_name,
|
|
'start': (w.timesheet_start_date.strftime('%Y-%m-%d')
|
|
if w.timesheet_start_date else None),
|
|
'end': (w.timesheet_end_date.strftime('%Y-%m-%d')
|
|
if w.timesheet_end_date else None),
|
|
} for w in works),
|
|
key=lambda w: w['name'].lower())
|
|
|
|
|
|
@app.route('/<database_name>/timesheet/employee/<int:employee>/lines/<date>',
|
|
methods=['GET'])
|
|
@with_pool
|
|
@with_transaction()
|
|
@timesheet_application
|
|
def timesheet_lines(request, pool, employee, date):
|
|
User = pool.get('res.user')
|
|
Employee = pool.get('company.employee')
|
|
Line = pool.get('timesheet.line')
|
|
|
|
employee = Employee(employee)
|
|
date = datetime.datetime.strptime(date, '%Y-%m-%d').date()
|
|
user = User(Transaction().user)
|
|
if employee not in user.employees:
|
|
abort(403)
|
|
|
|
with Transaction().set_context(
|
|
company=employee.company.id, employee=employee.id):
|
|
lines = Line.search([
|
|
('employee', '=', employee.id),
|
|
('date', '=', date),
|
|
])
|
|
return [{
|
|
'id': l.id,
|
|
'work': l.work.id,
|
|
'work.name': l.work.rec_name,
|
|
'duration': l.duration.total_seconds(),
|
|
'description': l.description,
|
|
} for l in lines]
|
|
|
|
|
|
@app.route('/<database_name>/timesheet/line/<int:line>',
|
|
methods=['PUT', 'DELETE'])
|
|
@app.route('/<database_name>/timesheet/line', methods=['POST'])
|
|
@with_pool
|
|
@with_transaction()
|
|
@timesheet_application
|
|
def timesheet(request, pool, line=None):
|
|
Line = pool.get('timesheet.line')
|
|
User = pool.get('res.user')
|
|
Employee = pool.get('company.employee')
|
|
if request.method in {'POST', 'PUT'}:
|
|
data = request.parsed_data
|
|
if 'employee' in data:
|
|
employee = Employee(data['employee'])
|
|
data['company'] = employee.company.id
|
|
else:
|
|
employee = User(Transaction().user).employee
|
|
if 'date' in data:
|
|
data['date'] = datetime.datetime.strptime(
|
|
data['date'], '%Y-%m-%d').date()
|
|
if 'duration' in data:
|
|
data['duration'] = datetime.timedelta(
|
|
seconds=data['duration'])
|
|
with Transaction().set_context(
|
|
company=employee.company.id, employee=employee.id):
|
|
if not line:
|
|
line, = Line.create([request.parsed_data])
|
|
else:
|
|
lines = Line.search([('id', '=', line)])
|
|
if not lines:
|
|
return Response(None, 204)
|
|
line, = lines
|
|
Line.write(lines, request.parsed_data)
|
|
return {
|
|
'id': line.id,
|
|
'work': line.work.id,
|
|
'work.name': line.work.rec_name,
|
|
'duration': line.duration.total_seconds(),
|
|
'description': line.description,
|
|
}
|
|
else:
|
|
with Transaction().set_user(0):
|
|
lines = Line.search([('id', '=', line)])
|
|
if lines:
|
|
line, = lines
|
|
with Transaction().set_context(
|
|
company=line.company.id, employee=line.employee.id):
|
|
lines = Line.search([('id', '=', line.id)])
|
|
Line.delete(lines)
|
|
return Response(None, 204)
|