Files
tradon/modules/stock/vessel.py
2026-01-20 17:30:13 +01:00

136 lines
4.7 KiB
Python
Executable File

import stdnum.exceptions
import logging
from sql import Column, Literal
from sql.aggregate import Min
from sql.functions import CharLength
from stdnum import get_cc_module
import urllib.request
from bs4 import BeautifulSoup
from decimal import Decimal
from trytond.i18n import gettext
from trytond.model import (
DeactivableMixin, Index, ModelSQL, ModelView, MultiValueMixin, Unique,
ValueMixin, convert_from, fields, sequence_ordered)
from trytond.model.exceptions import AccessError
from trytond.pool import Pool
from trytond.pyson import Bool, Eval
from trytond.tools import is_full_text, lstrip_wildcard
from trytond.transaction import Transaction, inactive_records
from trytond.wizard import Button, StateTransition, StateView, Wizard
logger = logging.getLogger(__name__)
class VesselType(ModelSQL, ModelView):
"Vessel Type"
__name__ = 'stock.vessel.type'
name = fields.Char('Vessel Type', required=True)
cargo_mode = fields.Selection([
('bulk', 'Bulk'),
('tanker', 'Tanker'),
('container', 'Container'),
], 'Cargo Mode', required=True)
dwt_min = fields.Integer('Min DWT')
dwt_max = fields.Integer('Max DWT')
teu_min = fields.Integer('Min TEU')
teu_max = fields.Integer('Max TEU')
class Vessel(
DeactivableMixin, ModelSQL, ModelView,
MultiValueMixin):
"Vessel"
__name__ = 'trade.vessel'
_rec_name = 'vessel_name'
vessel_name = fields.Char('Name',required=True)
vessel_imo = fields.Char("IMO")
vessel_type = fields.Many2One('stock.vessel.type',"Vessel Type")
vessel_year = fields.Char("Built year")
vessel_premium = fields.Numeric("Premium(%)",readonly=False)
vessel_info = fields.Function(fields.Text("Position"),'get_info')
image = fields.Binary("Vessel position",readonly=True)
@classmethod
def default_vessel_imo(cls):
return '9900459'
def get_info(self,name=None):
hdr = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
if not self.vessel_imo:
return
url = r'https://www.vesselfinder.com/en/vessels/VOS-TRAVELLER-IMO-' + self.vessel_imo
req = urllib.request.Request(url, None, hdr)
try:
with urllib.request.urlopen(req) as response:
the_page = response.read()
except urllib.error.HTTPError:
return ""
parsed_html = BeautifulSoup(the_page)
tables = parsed_html.findAll("section")
row = tables[0].findAll('div')
aux = row[0].findAll('p')
inf = ''
for a in aux:
inf += str(a)
inf = inf.replace("<strong>","")
inf = inf.replace("</strong>","")
inf = inf.replace("</p>]","")
inf = inf.replace("</p>","")
inf = inf[18:]
inf = inf.replace("\n", "")
inf = inf.replace("\\n", "")
inf = inf.replace("\r", "")
inf = inf.replace("\\r", "")
inf = inf.replace("\n\r", "")
inf = inf.replace("\\n\\r", "")
inf = inf.replace(" ", " ")
inf = inf.replace(" ", " ")
inf = inf.replace(" ", " ")
inf = inf.replace(". ", ".\n")
#aux = aux.replace(".", ".\\r")
#logger.info("GET_INFO:%s",aux)
return inf
@classmethod
def getVesselByName(cls, vessel, imo=None):
vessel = vessel.upper()
v = cls.search([('vessel_name', '=', vessel)], limit=1)
if v:
return v[0]
else:
v = cls()
v.vessel_name = vessel
v.vessel_imo = imo
cls.save([v])
return v
@classmethod
def remover(cls,tr = ""):
char_to_keep = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ")
for item in tr:
if item not in char_to_keep:
tr = tr.replace(item, "")
return tr
# @fields.depends('vessel_year')
# def on_change_with_vessel_premium(self, name=None):
# if self.vessel_year:
# config = Pool().get('trade.configuration')(1)
# Date = Pool().get('ir.date')
# diff = Date.today().year - int(self.vessel_year)
# logger.info("YEARDIFF:%s",diff)
# if diff >= 26 and diff <= 30:
# return config.old_vessel_rate_26_30
# elif diff >= 31 and diff <= 35:
# return config.old_vessel_rate_31_35
# else:
# return Decimal(0)