DigitalSignage/models/dss_kileads_requests.py

177 lines
7.0 KiB
Python

import ast
import datetime
import json
import re
import uuid
import logging
import base64
import subprocess
import tempfile
import easywebdav
import os
import os.path
import requests
import hashlib
from PIL import Image,ImageDraw,ImageFont
from odoo import api, fields, models, _
from odoo import tools
from odoo.exceptions import ValidationError
from datetime import date
from datetime import datetime
from dateutil.relativedelta import relativedelta
from pyffmpeg import FFmpeg
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
from webdav4.client import Client
from webdav4.fsspec import WebdavFileSystem
import sys
from urllib.parse import urlencode
TUYA_LOGGER.setLevel(logging.DEBUG)
_logger = logging.getLogger(__name__)
class dsskileadsrequests(models.Model):
@api.model
def create(self,vals):
result = super().create(vals)
return result
_name = "dss.kileads.requests"
_description = "DigitalSignage KI Lead requests"
_inherit = ['mail.thread','mail.activity.mixin']
_rec_name = "request_id"
# _inherit = ['mail.thread', 'mail.activity.mixin']
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
date_create = fields.Date('Erstellungsdatum',default=lambda self: self._default_create_date())
date_lastedit = fields.Date('Änderungsdatum')
user_create = fields.Char('Erstellungsuser',default=lambda self: self._default_create_user())
user_lastedit = fields.Char('Änderungsuser')
request_id = fields.Char(string="Request ID", required=True, default=lambda self: self._default_request_id(),tracking=True)
request_name = fields.Char(string="Name der Anfrage",tracking=True)
request_isparent = fields.Boolean(string="Hauptanfrage",tracking=True)
request_data_count = fields.Integer(string="Anfrage Anzahl",tracking=True)
request_data_offset = fields.Integer(string="Beginn der Anfrage",tracking=True)
request_parent = fields.Many2one("dss.kileads.requests")
request_text = fields.Char(string="Anforderungs-Text", required=True, help = "Der Text der Anfrage die zu den Ergebnissen geführt hat.",tracking=True)
request_project = fields.Many2one('dss.projects', string="Anfrage für Projekt",tracking=True)
request_finished = fields.Boolean(string='Anfrage Abgeschlossen',tracking=True)
request_translated = fields.Boolean(string='Anfrage Übersetzt',tracking=True)
request_canhavemore = fields.Boolean(string='Anfrage kann mehr Daten haben',tracking=True)
request_results = fields.Many2many('dss.kileads', string="Leads",tracking=True)
request_raw = fields.Char(string="Raw Antwort der Anfrage")
aktcount = fields.Integer(string="akt. Anzahl")
@api.model
def _default_uuid(self):
return str(uuid.uuid4())
@api.model
def _default_create_date(self):
return datetime.now().strftime('%Y-%m-%d %H:%M:%S')
@api.model
def _default_create_user(self):
return self.env.user.name if self.env.user else 'System'
@api.model
def _default_request_id(self):
# Generate a unique binary ID based on the current timestamp and a random UUID
return f"Request_{str(uuid.uuid4())[:8]}"
def pyaction_dss_kileads_requests_dorequest(self):
import http.client
conn = http.client.HTTPSConnection("google-maps-extractor2.p.rapidapi.com")
headers = {
'x-rapidapi-key': "e4644aea12mshd78789f07136e6dp15fc91jsned56df96c261",
'x-rapidapi-host': "google-maps-extractor2.p.rapidapi.com"
}
query_params = {
"query": self.request_text,
"offset": str(self.request_data_offset),
"limit": str(self.request_data_count),
"zoom": "15",
"country": "de",
"language": "de"
}
url = "/locate_and_search?" + urlencode(query_params)
conn.request("GET", url, headers=headers)
res = conn.getresponse()
data = res.read()
self.request_raw = data
self.request_finished = True
self.request_translated = False
return True
def pyaction_dss_kileads_requests_dobuild(self):
if not self.request_raw:
raise ValidationError("Keine Daten zum Erzeugen vorhanden ! Abfrage ausführen ...")
try:
raw_data = json.loads(self.request_raw)
except json.JSONDecodeError:
raise ValidationError("Invalid JSON format in raw data.")
results = []
counter = self.aktcount
icounter = 0
for item in raw_data.get("data", []):
kilead = self.env['dss.kileads'].create({"lead_name": item.get("name"),"lead_id": self.request_id + "_" + str(counter)})
kilead.lead_address = item.get("address")
kilead.lead_phone = item.get("full_phone")
kilead.lead_google_id = item.get("google_id")
kilead.lead_place_id = item.get("place_id")
kilead.lead_main_category = item.get("main_category")
kilead.lead_website = item.get("website_url")
kilead.lead_picture_url = item.get("featured_photo")
kilead.lead_longitude = item.get("longitude" )
kilead.lead_latitude = item.get("latitude")
kilead.lead_address_city = item.get("detailed_address").get("city")
kilead.lead_address_street = item.get("detailed_address").get("street")
kilead.lead_address_zip = item.get("detailed_address").get("zip_code")
kilead.lead_address_country = item.get("detailed_address").get("country")
kilead.lead_address_state = item.get("detailed_address").get("state")
kilead.lead_address_district = item.get("detailed_address").get("district")
kilead.lead_nummer = counter
kilead.lead_converted = True
kilead.lead_request = self
counter += 1
icounter += 1
self.aktcount = counter
kilead.lead_raw_data = item
self.request_results = [(4,kilead.id)]
self.request_canhavemore = True
if icounter<self.request_data_count:
self.request_finished = True
self.request_canhavemore = False
self.request_translated = True
return True
def pyaction_dss_kileads_requests_nextbuild(self):
if not self.request_canhavemore:
raise ValidationError("Anfrage kann keine weiteren Daten enthalten !")
newrequest = self.env['dss.kileads.requests'].create({
"request_name": self.request_name + " - Folgeanfrage ab " + str(self.request_data_offset + self.request_data_count),
"request_isparent": False,
"request_data_count": self.request_data_count,
"request_data_offset": self.request_data_offset + self.request_data_count,
"request_parent": self.id,
"request_text": self.request_text,
"request_project": self.request_project.id
})
return True