from collections import defaultdict from datetime import date, datetime from decimal import Decimal from flask import current_app, jsonify, request, url_for from flask_login import current_user, login_required, login_user from sqlalchemy import extract from sqlalchemy.exc import IntegrityError from . import api from .common import accessible_vehicles, boolv, fail, payload, response, role_required, station_dict, user_dict, vehicle_dict from .. import THEMES from ..api_tokens import create_access_token from ..extensions import db from ..models import AppSetting, CompanySettings, FuelCard, FuelCardPolicy, FuelCardStationRule, FuelEntry, FuelStationCompany, FuelStationPoint, OrlenPrice, User, Vehicle from ..services import POLISH_REGIONS, aggregate_ure_companies, calculate_costs, fetch_orlen_price, fetch_orlen_range, fetch_ure_stations, invoice_period from ..station_catalog import sync_station_catalog FUEL_TYPES = ("PB95", "PB98", "DIESEL", "LPG") @api.post('/auth/login') def login(): d=payload(); user=User.query.filter_by(email=(d.get('email') or '').strip().lower()).first() if not user or not user.check_password(d.get('password') or '') or not user.active: return fail('Nieprawidłowy e-mail lub hasło',401) login_user(user); return response({'user':user_dict(user),'redirect':url_for('main.dashboard')},'Zalogowano') @api.post('/auth/token') def token_login(): d = payload() email = (d.get('email') or d.get('username') or '').strip().lower() user = User.query.filter_by(email=email).first() if not user or not user.check_password(d.get('password') or '') or not user.active: return jsonify({'error':'invalid_grant','error_description':'Nieprawidłowy e-mail lub hasło'}), 401 expires_in = int(current_app.config['API_TOKEN_MAX_AGE_SECONDS']) return jsonify({ 'access_token': create_access_token(user), 'token_type': 'Bearer', 'expires_in': expires_in, 'user': user_dict(user), }) @api.get('/me') @login_required def me(): return response(user_dict(current_user))