Implement Google Maps Location Sharing integration
This commit is contained in:
@@ -26,9 +26,9 @@
|
||||
<!-- Otonom Google Konum Çekme Servisi (Her 1 Dakikada Çalışır) -->
|
||||
<record id="ir_cron_scrape_google_location" model="ir.cron">
|
||||
<field name="name">MyMach: Google Konum Paylaşımı (GPS) Otonom Senkronizasyon</field>
|
||||
<field name="model_id" ref="mymach_fleet_intelligence.model_mymach_fleet_security_log"/>
|
||||
<field name="model_id" ref="mymach_fleet_intelligence.model_mymach_fleet_google_sync"/>
|
||||
<field name="state">code</field>
|
||||
<field name="code">model.action_mymach_scrape_google_location()</field>
|
||||
<field name="code">model.sync_google_locations()</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">minutes</field>
|
||||
|
||||
@@ -12,3 +12,4 @@ from . import fuel_index
|
||||
from . import res_currency
|
||||
from . import res_users
|
||||
from . import fleet_vehicle_model
|
||||
from . import google_maps_sync
|
||||
|
||||
@@ -53,6 +53,7 @@ class FleetVehicle(models.Model):
|
||||
|
||||
# === Otonom GPS / Takip Cihazı (Faz 9) ===
|
||||
tracker_device_id = fields.Char(string="Takip Uygulaması ID", help="Traccar veya OwnTracks uygulamasındaki benzersiz kimlik (Device ID).")
|
||||
google_maps_name = fields.Char(string="Google Konum Görünen Adı", help="Şoförün Google Haritalar üzerinde görünen tam adı (Örn: Ahmet Yılmaz).")
|
||||
|
||||
# 3 Para Birimli Amortisman Maliyet Alanları ve Ortalama Değer
|
||||
depreciation_cost_try = fields.Float(string="Amortisman Maliyeti (Ana Döviz)", default=0.0)
|
||||
|
||||
72
addons/mymach_fleet_intelligence/models/google_maps_sync.py
Normal file
72
addons/mymach_fleet_intelligence/models/google_maps_sync.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from odoo import models, fields, api
|
||||
import logging
|
||||
import os
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
try:
|
||||
from locationsharinglib import Service
|
||||
LOCATION_SHARING_AVAILABLE = True
|
||||
except ImportError:
|
||||
LOCATION_SHARING_AVAILABLE = False
|
||||
_logger.warning("locationsharinglib is not installed. Google Maps Location Sharing sync will not work. Please run: pip install locationsharinglib")
|
||||
|
||||
class GoogleMapsSync(models.AbstractModel):
|
||||
_name = 'mymach.fleet.google.sync'
|
||||
_description = 'Google Maps Location Sharing Sync'
|
||||
|
||||
@api.model
|
||||
def sync_google_locations(self):
|
||||
"""
|
||||
Cron job tarafından çağrılır.
|
||||
Google Haritalar üzerinden paylaşılan konumları okur ve Odoo'daki araçların koordinatlarını günceller.
|
||||
"""
|
||||
if not LOCATION_SHARING_AVAILABLE:
|
||||
_logger.error("Cannot sync Google locations because locationsharinglib is not installed.")
|
||||
return
|
||||
|
||||
# Çerez dosyasının yolu: modülün /data/cookies.txt klasörü içinde olmalıdır.
|
||||
module_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
cookies_path = os.path.join(module_dir, 'data', 'cookies.txt')
|
||||
|
||||
if not os.path.exists(cookies_path):
|
||||
_logger.error(f"Google Maps çerez (cookie) dosyası bulunamadı: {cookies_path}. Lütfen çerez dosyasını buraya ekleyin.")
|
||||
return
|
||||
|
||||
google_email = self.env['ir.config_parameter'].sudo().get_param('mymach.google_maps_email', 'mymach.takip@gmail.com')
|
||||
|
||||
try:
|
||||
# locationsharinglib ile Google'a bağlan
|
||||
service = Service(cookies_file=cookies_path, authenticating_account=google_email)
|
||||
people = service.get_all_people()
|
||||
except Exception as e:
|
||||
_logger.error(f"Google Haritalar konumları çekilirken hata oluştu (Çerez süresi dolmuş olabilir): {str(e)}")
|
||||
return
|
||||
|
||||
# Sadece Google Konum Görünen Adı girilmiş araçları bul
|
||||
vehicles = self.env['fleet.vehicle'].search([('google_maps_name', '!=', False)])
|
||||
|
||||
# Hızlı eşleştirme için küçük harfe çevrilmiş sözlük oluştur
|
||||
vehicle_map = {v.google_maps_name.strip().lower(): v for v in vehicles if v.google_maps_name}
|
||||
|
||||
match_count = 0
|
||||
for person in people:
|
||||
person_name = person.full_name.strip().lower()
|
||||
|
||||
# Görünen adı eşleşen aracı bul
|
||||
vehicle = vehicle_map.get(person_name)
|
||||
|
||||
if vehicle:
|
||||
# Koordinatları ve son güncelleme zamanını kaydet
|
||||
vehicle.sudo().write({
|
||||
'latitude': person.latitude,
|
||||
'longitude': person.longitude,
|
||||
# Hız verisi gelmezse ufak bir varsayılan verebiliriz veya hareketli göstermek için 5 koyabiliriz
|
||||
'gps_speed': 5.0,
|
||||
'last_gps_update': fields.Datetime.now()
|
||||
})
|
||||
match_count += 1
|
||||
_logger.info(f"Araç konumu güncellendi: {vehicle.license_plate} - {person.full_name} ({person.latitude}, {person.longitude})")
|
||||
|
||||
_logger.info(f"Google Konum Senkronizasyonu Tamamlandı. Toplam {len(people)} kişiden {match_count} araç eşleştirildi.")
|
||||
@@ -31,6 +31,7 @@
|
||||
<field name="mymach_vehicle_type" />
|
||||
<field name="mymach_location_id" />
|
||||
<field name="tracker_device_id" />
|
||||
<field name="google_maps_name" placeholder="Ahmet Yılmaz"/>
|
||||
</xpath>
|
||||
<xpath expr="//notebook" position="inside">
|
||||
<page string="Finans & Gider Analizi (KM / Aylık / Yıllık)">
|
||||
|
||||
Reference in New Issue
Block a user